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?
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. –
+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. –
'intern'ing chỉ được thực hiện tự động trên các chuỗi' String'. – Jeffrey