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!
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
(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
@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