2015-08-14 33 views
15
public static void main(String[] args) { 
    String str1 = new StringBuilder("计算机").append("软件").toString(); 
    System.out.println(str1.intern() == str1); 
    String str2 = new StringBuffer("ja").append("va").toString(); 
    System.out.println(str2.intern() == str2); 
} 

Kết quả:Tại sao kết quả của str == str.intern() cho các chuỗi khác nhau?

true 
false 

Đầu tiên một bản in true, và các bản in thứ hai false. Tại sao kết quả lại khác?

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern() – twentylemon

+0

xin lỗi! Tôi không hiểu điểm của bạn là gì? – side

+0

Tại sao không? Không có lý do tại sao một trong hai người trong số họ nên trả về 'true', hoặc tại sao cả hai đều nên trả về cùng một kết quả. – EJP

Trả lời

4

Do bài tập của bạn không được đọc lại từ intern pool và Java String (s) là không thay đổi. Cân nhắc

String str1 = new StringBuilder("计算机").append("软件").toString(); 
String str1a = new String(str1); // <-- refers to a different String 
str1 = str1.intern(); 
str1a = str1a.intern(); 
System.out.println(str1a == str1); 
String str2 = new StringBuffer("ja").append("va").toString(); 
String str2a = new String(str2); // <-- refers to a different String 
str2 = str2.intern(); 
str2a = str2a.intern(); 
System.out.println(str2a == str2); 

Đầu ra là (như bạn mong đợi)

true 
true 
+0

vì vậy có nghĩa là str1 và str1a có cùng tham chiếu – side

+2

@side Bất kỳ lúc nào hai đối tượng bằng nhau với '==' chúng có cùng tham chiếu. –

20

Sự khác biệt trong hành vi không liên quan đến sự khác biệt giữa StringBuilderStringBuffer.

Các javadoc của String#intern() khẳng định rằng nó sẽ trả về

Khi phương pháp thực tập được gọi, nếu hồ bơi đã có chứa một chuỗi bằng đối tượng này String được xác định bởi equals(Object) phương pháp, sau đó chuỗi từ hồ bơi được trả về. Nếu không, đối tượng String này được thêm vào hồ bơi và tham chiếu đến đối tượng String này được trả về.

Các String tạo từ

String str2 = new StringBuffer("ja").append("va").toString(); 

là một thương hiệu mới String mà không thuộc về hồ bơi.

Đối

str2.intern() == str2 

trở false, cuộc gọi intern() phải đã trở về một giá trị tham khảo khác nhau, ví dụ. số String"java" đã có trong hồ bơi.

Trong lần so sánh đầu tiên, String "计算机 软件" không nằm trong nhóm chuỗi trước để gọi đến intern(). intern() do đó trả lại cùng một tham chiếu như được lưu trữ trong str2. Độ cân bằng tham chiếu str2 == str2 do đó trả lại true.

+1

Điều này không giải thích tại sao ví dụ khác hoạt động khác nhau mặc dù –

+2

@JeroenVannevel Trích dẫn _Otherwise, đối tượng String này được thêm vào hồ bơi và tham chiếu đến đối tượng String này được trả về._ không đủ tốt? –

+1

@SotiriosDelimanolis: chuỗi khác được thực hiện là tốt, sự khác biệt duy nhất là stringbuilder/stringbuffer và các ký tự khác nhau đặt –

1

Rất nhiều câu trả lời trước khi được đề cập về hồ bơi và giải thích rõ ràng với tài liệu liên kết Oracle.

Tôi chỉ muốn chỉ ra cách chúng ta có thể kiểm tra khi gỡ lỗi mã.

String str1 = new StringBuilder("计算机").append("软件").toString(); 
    System.out.println(str1.intern() == str1);//the str1.intern() returns the same memory address the str1 
    String str2 = new StringBuffer("ja").append("va").toString(); 
    System.out.println(str2.intern() == str2);//the str2.intern() does not return the same memory address the str2 

Bạn có thể sử dụng bất kỳ IDE và gỡ lỗi để kiểm tra địa chỉ thực tế rằng str1 và str1.intern()/str2 và str2.intern().

+0

Hãy suy nghĩ cho bạn lời khuyên của bạn! – side

+0

Bạn đã thử nó chưa ?! –

+0

Có, tôi gỡ lỗi chương trình của tôi chỉ biết! kết quả như bạn mong đợi – side

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