2012-05-19 29 views
6

Ok, câu hỏi này là một phần mở rộng của câu hỏi nàyTôi không nên làm `String s = new String (" một chuỗi mới ");` trong Java, ngay cả với chuỗi ký tự tự động?

Java Strings: "String s = new String("silly");"

Câu hỏi trên hỏi những câu hỏi tương tự như thế này, nhưng tôi có một điểm nghi ngờ mới.

Theo Effective Java và câu trả lời của câu hỏi trên, chúng tôi phải không làm String s = new String("a new string");, vì điều đó sẽ tạo ra đối tượng không cần thiết.

Tôi không chắc chắn về kết luận này, bởi vì tôi nghĩ Java đang làm automatic string interning, có nghĩa là cho một chuỗi, dù sao chỉ có một bản sao của nó trong bộ nhớ.

Vì vậy, hãy xem String s = new String("a new string");.

"a new string" đã là một chuỗi đã được tạo trong bộ nhớ.

Khi tôi làm String s = new String("a new string");, thì s cũng là "a new string". Vì vậy, theo automatic string interning, s phải được trỏ đến cùng một địa chỉ bộ nhớ của "a new string", phải không?

Sau đó, làm cách nào chúng ta có thể nói chúng ta tạo ra các đối tượng không cần thiết?

+9

Có * là * chỉ một bản sao của chuỗi * trừ khi bạn thực hiện 'chuỗi mới (...)' *. Đừng làm điều đó trừ khi bạn phải làm vậy. –

+0

+1 cho câu hỏi thú vị, không bao giờ nghĩ về nó. Tuy nhiên, hầu hết thời gian bạn có thể kiểm tra công cụ này bằng cách xem xét sự khác biệt (hoặc thiếu sự khác biệt) trong bytecode giữa 2 phiên bản. –

+6

'intern'ing chỉ được thực hiện tự động trên các chuỗi' String'. – Jeffrey

Trả lời

16

String a = "foo"; // this string will be interned 
String b = "foo"; // interned to the same string as a 
boolean c = a == b; //this will be true 
String d = new String(a); // this creates a new non-interned String 
boolean e = a == d; // this will be false 
String f = "f"; 
String g = "oo"; 
String h = f + g; //this creates a new non-interned string 
boolean i = h == a // this will be false 
File fi = ...; 
BufferedReader br = ...; 
String j = br.readLine(); 
boolean k = a == j; // this will always be false. Data that you've read it is not automatically interned 
+0

Câu trả lời hay. Rất đơn giản – keyser

0

sử dụng "=" thay vì "= chuỗi mới" tốt hơn vì có thể dẫn đến một cá thể thay vì nhiều phiên bản.

2

Bạn có thể muốn đọc thêm về Chuỗi chữ theo nhóm trong JVM. Googling nhanh chóng chỉ cho tôi bài viết này: http://www.xyzws.com/Javafaq/what-is-string-literal-pool/3 có vẻ khá hợp lệ.

Ngoài ra, bạn cũng có thể quan tâm Ghép cặp bằng chữ số nguyên cũng như các nhóm ngữ pháp khác trong Java.

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