2013-06-25 59 views
8

Điều này liên quan đến sự khác biệt trong kết quả được trả về bởi toán tử '+'. Kết quả khác nhau đối với String literal và String Object.+ Toán tử trong chuỗi lớp

String str="ab"; 
String str1="c"; 
String str2 = "ab"+"c"; // Line 3 
String str3 = "abc"; 
String str4 = str+str1; // Line 5 

System.out.println(str2==str3); // True 
System.out.println(str2==str4); // False 

Với kết quả chúng ta có thể suy ra rằng với nghĩa đen, đối tượng đã có sẵn từ hồ bơi chuỗi được trả lại như trong trường hợp của dòng 3 và với chuỗi phản đối đối tượng mới được trả lại, như trong dòng 5. Tại sao nó như vậy ?

+0

Tôi đã so sánh tham chiếu bình đẳng trong trường hợp này. – Prashant

+0

+1, tôi cũng muốn biết lý do tại sao, mặc dù tôi cho rằng đó là vì bạn đang chỉ định các chuỗi ký tự 1-4 và làm nối trong str4 Tôi không chắc chắn nếu theres'a một lý do khác. – Thihara

Trả lời

9

Trình phân tích + cho String s được xử lý khác nhau tùy thuộc vào thời điểm biểu thức có thể được đánh giá.

Khi biểu thức có thể được đánh giá tại thời gian biên dịch (như trong dòng 3) trình biên dịch sẽ tạo ra một String chỉ chứa kết nối. Do đó trong dòng 3 chỉ có String "abc" sẽ được tạo và String sẽ được đặt trong tệp .class. Do đó, str3str4 sẽ giống hệt nhau và sẽ được thực tập.

Khi sử dụng kết nối chỉ có thể được đánh giá khi chạy (như trong dòng 5), kết quả StringString mới phải được so sánh wth equals() vì nó là đối tượng mới.

3

String str2 = "ab"+"c"; điều này được đánh giá tại biên dịch thời gian. Nó đi đến các hồ bơi liên tục, vì nó đã được biết đến với trình biên dịch.

Khác có thể được đánh giá tại thời gian chạy, nó sẽ không là một phần của hồ bơi không đổi.

Đó là cơ hội tốt để lưu ý sự khác biệt từ trường hợp bạn sử dụng String#concat, nếu bạn làm

String str2 = "ab".concat("c");

Kể từ String là bất biến, một String mới được trả về từ concat gây str để không bị thực tập nội trú. Vì vậy, trong trường hợp này, str2 == str3 sẽ là false.

0

Tôi đã đánh dấu câu hỏi là trùng lặp, nhưng thấy rằng câu trả lời tương tự chưa được đăng nên hãy nghĩ đến việc cho nó đi. Các câu trả lời khác đã chỉ ra tại sao câu trả lời là sai. Nhưng đây là một cái gì đó cho bạn thấy khi nó sẽ là sự thật.

Nếu bạn gọi intern() trên chuỗi thứ hai thì kết quả sẽ là true.

Tại sao tính năng này hoạt động?

Để tiết kiệm bộ nhớ (và tăng tốc độ kiểm tra bình đẳng), Java hỗ trợ "interning" của Strings. Khi phương thức intern() được gọi trên một String, một tra cứu được thực hiện trên một bảng các chuỗi nội bộ. Nếu một đối tượng String có cùng nội dung đã có trong bảng, tham chiếu đến Chuỗi trong bảng được trả về. Nếu không, String được thêm vào bảng và tham chiếu đến nó được trả về.

String str4 = (str+str1).intern(); 

Rõ ràng cách gọi intern() trả về một tham chiếu đến thực tập nội trú String.

0

Khi bạn sẽ tạo str, str1, str2 và str3 nó sẽ trỏ đến cùng một nhóm chuỗi. Ở đây nó sẽ không tạo đối tượng chuỗi. Nhưng khi bạn sẽ tạo ra chuỗi str4 = str + str1.So str4 được đánh giá tại thời gian chạy.So là wont là một phần của cùng một chuỗi hồ bơi, nơi tất cả các chuỗi khác được chỉ.So str4 trả về false ..

+0

Điều này không đúng. Ví dụ, 'str == str1' là' false'. Họ sẽ được interned iff họ được đánh giá về thời gian biên dịch và có cùng một chuỗi giá trị. – Maroun

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