2012-09-05 39 views
15

thể trùng lặp:
intern() behaving differently in Java 6 and Java 7Chuỗi thực tập câu đố

On blog này tôi thấy thú vị Chuỗi câu đố:

--- Quote ---

String te = "te", st = "st"; 
//"test".length(); 
String username = te + st; 
username.intern(); 
System.out.println("String object the same is: " 
    + (username == "test")); 

in dưới Java 7 update 7.

String object the same is: true

nhưng bỏ ghi chú là "thử nghiệm" .length(); dòng, hoặc chạy với Java 6 và nó in

String object the same is: false

--- EOQ ---

Là trung thực tôi không hiểu tại sao các kết quả đầu ra là khác nhau. Bạn có thể giải thích cho tôi nguyên nhân của hành vi đó là gì?

+2

cũng là 'sai' trong cả hai trường hợp –

+0

có @Jigar là đúng, khi tôi thử mã của bạn, đầu ra là false luôn –

+2

Sai hoặc không khác với phiên bản Java. –

Trả lời

14

Bạn cần phải gán chuỗi thực tập nội trú trở lại username:

String username = te + st; 
username = username.intern(); 

Trong trường hợp này, cả hai mã sẽ ra true.

Dưới đây là một ví dụ thú vị:

final String te = "te", st = "st"; 
"test".length(); 
String username = (te + st); 
System.out.println("String object the same is: " + (username == "test")); 

in đúng là tốt, vì te và st được đánh dấu là thức. Vì vậy, tên người dùng sẽ trở thành một hằng số thời gian biên dịch và được tự động thực hiện.

EDIT

Theo một số người chỉ ra bản in mã của bạn sai với Java 6, ngay cả khi dòng "test".length là nhận xét ra.

Điều này là do one of the changes introduced in Java 7:

trong JDK 7, thực tập nội trú chuỗi không còn được phân bổ trong thế hệ thường trực của đống Java, nhưng thay vì phân bổ trong phần chính của heap Java (còn gọi là các thế hệ trẻ và cũ), cùng với các đối tượng khác được tạo ra bởi ứng dụng.

Một hệ quả là the code you posted has different outputs in Java 6 and 7 (xem ví dụ ở cuối báo cáo lỗi).

5

Vui lòng kiểm tra câu trả lời của Does String.intern() change reference of Original String

Nó không phải là String mà được thay đổi, nhưng đối tượng được sử dụng để "thử nghiệm" được thay đổi.

Vì vậy, trong trường hợp của bạn nếu "test" được định nghĩa đầu tiên có nghĩa là nếu bạn làm đầu tiên sau đó "test".length();"test" là trong chuỗi hồ bơi kết quả hiện đầu tiên là false.

Bây giờ if you comment this line sau đó sau khi gọi username.intern(); "test" được thêm vào hồ bơi chuỗi nay là tiếp theo "test" mà bạn đang sử dụng để so sánh được phân bổ tương đối tượng được đặt bởi username.intern(); phương pháp. Vì vậy nó là true

nên

Commented //"test".length(); -> True 
Un Commented "test".length(); --> False 
Các vấn đề liên quan