2010-09-06 37 views
14

Sự khác nhau giữa String str = new String("SOME")String str="SOME" Các khai báo này có thay đổi hiệu suất hay không.Khai báo chuỗi Java

+0

Xem thêm http://stackoverflow.com/questions/334518/java-strings-string-s-new-stringsilly và http://stackoverflow.com/questions/390703/what-is-the-purpose-of -e-expression-new-string-in-java – polygenelubricants

Trả lời

29
String str = new String("SOME") 

luôn tạo ra một đối tượng mới trên heap

String str="SOME" 

sử dụng String pool

Hãy thử ví dụ nhỏ này:

 String s1 = new String("hello"); 
     String s2 = "hello"; 
     String s3 = "hello"; 

     System.err.println(s1 == s2); 
     System.err.println(s2 == s3); 

Để tránh tạo các đối tượng unnecesary về việc sử dụng đống hình thức thứ hai.

9

Có sự khác biệt nhỏ giữa cả hai.

khai Second assignates tài liệu tham khảo liên quan đến hằng SOME vào biến str

khai đầu tiên tạo ra một chuỗi mới có giá trị cho giá trị của hằng số SOME và assignates tham chiếu của nó vào biến str.

Trong trường hợp đầu tiên, một chuỗi thứ hai đã được tạo có cùng giá trị SOME hàm ý nhiều thời gian bắt đầu hơn. Kết quả là, bạn nên tránh nó. Hơn nữa, tại thời gian biên dịch, tất cả các hằng số SOME được chuyển đổi thành cùng một thể hiện, sử dụng ít bộ nhớ hơn.

Kết quả là, luôn thích cú pháp thứ hai.

+3

Đối với bản ghi, có các tình huống trong đó 'chuỗi mới (Chuỗi)' có ý nghĩa, giống như nếu bạn có một chuỗi rất lớn và bạn chỉ quan tâm đến việc giữ lại một chuỗi con nhỏ . Các phương thức 'substring' chỉ trả về một dạng xem thừa của chuỗi ban đầu, do đó, bằng cách sử dụng' new String (bigString.substring (a, b)) 'buộc một bản sao và cho phép GC lấy lại nội dung của' hugeString' khi nó đi ra khỏi phạm vi. Họ không nên làm cho nó một nhà xây dựng, mặc dù ... – gustafc

+0

Trường hợp thú vị của tối ưu hóa, quả thật vậy, nhưng tôi sẽ không đi con đường này trước khi đã thực hiện một số kiểm tra profiler (vì vậy bạn sẽ, tôi đoán). – Riduidel

0

Đầu tiên sẽ tạo đối tượng String mới trong heap và str sẽ tham chiếu nó. Ngoài ra, chữ cũng sẽ được đặt trong nhóm String. Nó có nghĩa là 2 đối tượng sẽ được tạo và 1 biến tham chiếu.

Tùy chọn thứ hai sẽ tạo chuỗi ký tự bằng chữ trong nhóm và chỉ str sẽ tham chiếu nó. Vì vậy, chỉ có 1 đối tượng sẽ được tạo và 1 tham chiếu. Tùy chọn này sẽ sử dụng cá thể từ String pool luôn luôn thay vì tạo một thể hiện mới mỗi khi nó được thực hiện.

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