2012-01-25 24 views
5

Tôi đã hỏi câu hỏi này:Java xử lý các đối tượng String trong bộ nhớ như thế nào?

String s = "abc"; // creates one String object and one 
      // reference variable 
In this simple case, "abc" will go in the pool and s will refer to it. 
String s = new String("abc"); // creates two objects, 
       // and one reference variable* 

Dựa trên thông tin chi tiết trên có bao nhiêu đối tượng String và bao nhiêu biến tài liệu tham khảo đã được tạo ra trước khi báo cáo kết quả println dưới mã?

String s1 = "spring "; 
String s2 = s1 + "summer "; 
s1.concat("fall "); 
s2.concat(s1); 
s1 += "winter "; 
System.out.println(s1 + " " + s2); 

câu trả lời của tôi là Kết quả của đoạn mã này là đông xuân mùa xuân mùa hè

Có hai biến tham khảo, s1 và s2. Có tổng cộng tám đối tượng String được tạo như sau: "mùa xuân", "mùa hè" (mất), "mùa xuân mùa xuân", "mùa thu" (mất), "mùa xuân mùa thu" (mất), "mùa xuân hè xuân" (mất), "mùa đông" (bị mất), "mùa xuân mùa đông" (tại thời điểm này "mùa xuân" bị mất).

Chỉ hai trong số tám đối tượng String không bị mất trong quá trình này.

Có đúng không?

+0

Điều gì đó cần biết: http://stackoverflow.com/questions/7663252/java-string-concat-in-stringbuilder-call/ Lưu ý rằng câu trả lời của tôi cho câu hỏi này là sai ... – Gevorg

Trả lời

3

trả lời là: 2 tài liệu tham khảo và 8 đối tượng

String s1 = "spring "; //One reference and 1 object in string pool. (if it didn't exist already) 

String s2 = s1 + "summer "; //Two references and 3 objects 

s1.concat("fall "); //Two references and 5 objects 

s2.concat(s1); //Two references and 6 objects 

s1 += "winter "; //Two references and 8 objects 

System.out.println(s1 + " " + s2); 

Bây giờ câu hỏi của bạn:.? Làm thế nào để các đối tượng Java xử lý string trong bộ nhớ

012.351.

Java cung cấp hai cách để tạo đối tượng của lớp String.

  1. Chuỗi str1 = "OneString";

Trong trường hợp này, JVM tìm kiếm nhóm chuỗi để xem chuỗi tương đương đã tồn tại chưa. nếu có, trả về tham chiếu cho cùng. nếu không, hãy thêm nó vào chuỗi chuỗi và trả về tham chiếu. Vì vậy, một đối tượng mới có thể được tạo ra HOẶC có thể không.

  1. Chuỗi str1 = new String ("OneString");

Bây giờ, JVM phải tạo đối tượng trên heap. do mới. không quan trọng nếu OneString đã có trong nhóm chuỗi.

Bạn cũng có thể đặt một chuỗi hồ bơi:

Bạn có thể gọi thực tập() trên một đối tượng String. Điều này sẽ đặt đối tượng String trong nhóm nếu nó chưa có ở đó và trả về tham chiếu đến chuỗi gộp chung. (Nếu nó đã có trong hồ bơi, nó chỉ trả về một tham chiếu đến đối tượng đã có).

Bạn có thể muốn nhìn vào liên kết sau đây:

What is the Java string pool and how is "s" different from new String("s")?

Questions about Java's String pool

1

Có vẻ chính xác. Đây là một câu hỏi thi SCJP btw.

concat trả về một Chuỗi mới, điều này bị mất. Các s1 đầu tiên được ghi đè với "mùa đông mùa xuân"

Hai điều bạn nên biết về Strings trong Java:

  • Strings là không thay đổi (như đã giải thích bởi bạn)
  • Strings có thể nằm trong String hồ bơi. Không phải mỗi khi bạn viết "Mùa hè" một chuỗi hoàn toàn mới được xây dựng, "Mùa hè" bất biến có thể đi ra khỏi hồ bơi (phụ thuộc vào JVM, nhưng đối với Oracle, đó là). Xem thêm: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#intern()

Cheers Christian

+0

Bạn có thể nhận xét thêm về _Không phải mỗi khi bạn viết chuỗi mới ("Mùa hè"), một chuỗi hoàn toàn mới được tạo_? Bằng cách sử dụng "mới", ** đối tượng java.lang.String ** mới phải được tạo (ví dụ: hai chuỗi không giống nhau khi so sánh chúng bằng ==). Tuy nhiên, hai cá thể String riêng biệt này có thể chia sẻ mảng char [] bên dưới (trong các điều kiện nhất định). –

+0

Có, tôi đã nhập nhanh. Bạn đã đúng, đối tượng String được xây dựng - tôi chỉ có nghĩa là "String" chính nó có thể không cần nhiều bộ nhớ hơn, bởi vì nó nằm trong nhóm chuỗi. Ngoài ra, vui lòng xem: http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#intern() – Christian

1

Strings trong java là không thay đổi. Có mảng ký tự được phân bổ và một số thông tin xung quanh như bù đắp và chiều dài. Trong trường hợp bạn đang sử dụng chuỗi ký tự để khởi tạo chuỗi, trình biên dịch sẽ cố gắng tối ưu hóa và sẽ chỉ tạo một đối tượng chuỗi cho mỗi chữ - điều này là có thể vì chúng không thay đổi được.

Nếu bạn làm nối hoặc + trên dây, sau đó chuỗi mới sẽ được alloacted và dữ liệu compied với nhau (với hình phạt hiệu quả

Trái ngược với điều này, tạo ra chuỗi con ra khỏi chuỗi được hầu như miễn phí -. Không có dữ liệu sẽ được sao chép

1
String s = "abc"; // creates one String object and one 
       // reference variable 

Tạo một đối tượng chuỗi chỉ nếu đối tượng không có mặt trên Chuỗi không đổi Pool đã .

String s = new String("abc"); // creates two objects, 
           // and one reference variable* 

Điều này thực sự chỉ tạo một đối tượng trong heap. Nó thêm đối tượng này vào nhóm nếu và chỉ khi phương thức intern() được gọi trên đối tượng String này.

String s1 = "spring "; 
String s2 = s1 + "summer ";   
s1.concat("fall ");   
s2.concat(s1);   
s1 += "winter "; 
System.out.println(s1 + " " + s2); 

Bạn giải thích có vẻ ok, ngoại trừ bạn có một chuỗi nhiều trong System.out.println(). :-)
Khi bạn nói (mất) nó thực sự có nghĩa là nó không thành vấn đề sống hơn (tài liệu tham khảo không có mặt trên ngăn xếp).

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