2013-05-22 40 views
5

Vì vậy, tôi đang học cho SCJP từ cuốn sách Kathy Sierra. Trong chương cho các chuỗi, đây là một câu hỏi:Các chuỗi được sử dụng trong System.out.println cũng có tạo ra các đối tượng bất biến mới không?

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter"; 
System.out.println(s1+" "+s2); 
--------------------------- 
What's the output, and how many string objects and ref variables are created? 

Đầu ra là đông xuân mùa xuân mùa hè và có hai biến tài liệu tham khảo, đó là tốt.

Sau đó, nó cho biết có tám đối tượng chuỗi được tạo ra (mùa xuân, mùa hè, mùa xuân hè ... vv) BAO GỒM những người bị mất do không có gì đề cập đến chúng.

Tuy nhiên, nó không bao gồm bất kỳ thứ gì từ sysout cuối cùng.

Câu hỏi của tôi là, trong dòng cuối cùng của mã, vì s1 và s2 đang được concat với một không gian, không phải điều này cũng tạo ra các đối tượng mới? Hay đơn giản nó sẽ được chuyển tới bộ đệm chuỗi để hiển thị và không tạo các đối tượng mới?

Điều này rõ ràng là rất cơ bản và tôi đã tìm ở nơi khác nhưng không có gì trực tiếp trả lời câu hỏi này. Từ sự hiểu biết của tôi, nó sẽ tạo ra các đối tượng mới ở đó quá, nhưng tôi cần phải chắc chắn cho kỳ thi! Suy nghĩ?

Xin cảm ơn, trước!

+2

Biên dịch mã ở trên, cấp mã đó vào 'javap -c' và kiểm tra những gì bytecode nó biên dịch. Phải là một 'StringBuffer' ngầm định mà cuối cùng nhận được' toString() 'được gọi, nó sẽ trả lời câu hỏi. – millimoose

+2

(Ngoài ra, câu hỏi cũng giống như mọi thứ sai với chứng nhận. Điều đó thậm chí còn có ý nghĩa gì đối với một biến tham chiếu được * tạo *? Chúng là một cấu trúc biên dịch, chúng được khai báo tốt nhất. từ khi chuỗi ký tự được tạo ra - chúng chắc chắn được tạo sớm hơn kết quả của thao tác chuỗi thao tác.) – millimoose

+0

@millimoose tôi nghĩ rằng những câu hỏi đó được thiết kế để kiểm tra kiến ​​thức của bạn về instantiation đối tượng, jvm và String hằng số - tất cả các vùng rất hợp lệ :) – vikingsteve

Trả lời

5

Câu hỏi của tôi là, trong dòng cuối cùng của mã, vì s1 và s2 đang được ghép với một khoảng trắng, điều này cũng không tạo ra các đối tượng mới?

Có, nó tạo chuỗi thứ 10. Lưu ý rằng đoạn mã này tự nó chỉ cần tạo ra 5 chuỗi - nếu bạn chạy nó nhiều lần trong cùng một JVM, nó sẽ tạo ra 5 chuỗi mới mỗi lần bạn gọi nó. Các chuỗi ký tự sẽ không tạo chuỗi mới mỗi khi mã chạy. (Các đối tượng cùng một chuỗi được tái sử dụng cho "spring " mỗi lần, ví dụ.)

Có 10 chuỗi trong mã bạn đã đưa ra:

  • 5 chữ: "mùa xuân", "Mùa hè", " rơi "," mùa đông "và" "
  • 5 kết quả ghép: s1 + "summer", s1.concat("fall "), s1 + winter (có phân bổ hợp chất) và s1 + " " + s2.

Như tôi vừa nhận xét, một chuỗi ký tự xuất hiện trong mã không luôn luôn liên quan đến một chuỗi riêng biệt. Ví dụ: xem xét:

String x = "Foo" + "Bar"; 

Bạn có thể mong đợi có liên quan đến ba đối tượng chuỗi - một đối tượng cho mỗi chữ cái và một đối với kết nối.Trong thực tế, nó chỉ liên quan đến một, bởi vì trình biên dịch thực hiện việc nối tại thời gian biên dịch, vì vậy mã là một cách hiệu quả:

String x = "FooBar"; 
+0

Bạn có nghĩa là nếu chúng tồn tại trong chuỗi hằng số chuỗi, chúng sẽ không được tạo lại chính xác? Chẳng phải nó sẽ tạo ra năm chuỗi sao? Bao gồm khoảng trống trong dòng mã cuối cùng - "" Sau đó, chính xác thì cuốn sách có ý nghĩa gì, khi nó nói nó tạo ra các đối tượng chuỗi? Nó có nghĩa là 9 chuỗi đối tượng, nhưng chỉ có 5 chuỗi ký tự? –

+0

Trừ khi bạn nói mới() trong trường hợp đó một bản sao sẽ được tạo. –

+0

@ nilay9999: Bạn hoàn toàn đúng: tôi đã bị đánh cắp. Có 10 chuỗi; 5 literals ('" spring "', '" summer "', '" fall "', '" winter "', '" "') và 5 kết quả nối ('s1 +" summer "', 's1.concat ("fall") ',' s1 + winter' (với phép gán phức) và 's1 +" "+ s2'). –

2

tôi sẽ anwser khác, câu hỏi rõ ràng hơn: có bao nhiêu trường hợp String được tham gia vào việc đoạn mã sau:

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter"; 
System.out.println(s1+" "+s2); 
  1. Chuỗi đen "mùa xuân"
  2. Chuỗi đen "Mùa hè"
  3. Concatenation của s1 và "Mùa hè"
  4. Chuỗi chữ "mùa thu"
  5. Concatenation của s1 và "rơi"
  6. Concatenation của s2 và s1
  7. Chuỗi đen "mùa đông"
  8. Concatenation của s1 và "mùa đông"
  9. Chuỗi đen ""
  10. Kết hợp s1 và s2 trong sysout

Vì vậy, 10 trong tổng số.

+0

Cảm ơn vì điều này - chỉ là về để yêu cầu Jon Skeet để thêm này vào câu trả lời của mình. Rất hữu ích. –

+0

@AndrewMartin: Như OP đã chỉ ra, cũng có "" - vì vậy có tổng cộng 10. Tôi đã bỏ lỡ lần đầu tiên. –

+0

@ JonSkeet: Buồn cười, vừa gãi đầu tôi trước cái đó. Làm cho cảm giác bây giờ, cổ vũ. –

Các vấn đề liên quan