2012-09-05 28 views
5

thể trùng lặp:
intern() behaving differently in Java 6 and Java 7Liệu String.intern() thay đổi tham chiếu của gốc Chuỗi JDK7

Trong khi làm ví dụ cho this question

tôi nhận thấy một hành vi kỳ lạ của intern() phương pháp khi tôi gọi phương thức intern() trên String sau đó tôi có thể sử dụng toán tử == hoặc Chuỗi gốc.

javadoc của intern() phương pháp:

Trả về một đại diện kinh điển cho đối tượng chuỗi. Một chuỗi các chuỗi, ban đầu trống rỗng, được duy trì riêng bởi chuỗi lớp.

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

Sau đó, đối với bất kỳ hai chuỗi nào st, s.intern() == t.intern() là đúng nếu và chỉ khi s.equals(t) là đúng.

Phía trên Javadoc không nói rằng chuỗi gốc bị thay đổi. Vì vậy, tại sao chương trình này in okay khi test là đầu vào.

import java.util.Scanner; 

public class Test { 
    public static void main(String[] args) { 
     Scanner user_input = new Scanner(System.in); 
     String username; 
     System.out.print("username: "); 
     username = user_input.next(); 
     // Even if I do not assign returned string for comparison still it compares 
     // okay else it does not compare 
     username.intern(); 
     if (username == "test") { 
      System.out.println("okay"); 
     } 
     else { 
      System.out.println("not okay"); 
     } 
    } 
} 
+1

Cuộc gọi 'intern()' * không được * có thể ảnh hưởng đến kết quả của thử nghiệm bên dưới. –

+1

@ JoachimSauer thật thú vị. Chỉ cần thử nó với Java7 mới nhất. –

+0

Đã thử với java 6 và in "không ổn". – dcernahoschi

Trả lời

3

String.intern() trả về thực tập() ed String. Điều này là do một phương thức không thể thay đổi một tham chiếu được truyền cho nó.

Vì vậy, tại sao chương trình này in được khi kiểm tra là đầu vào.

Nó in được bởi vì chuỗi ed() là lần đầu tiên chuỗi này được nhìn thấy để nó trở thành một chuỗi ký tự cho "thử nghiệm". Nó không phải là String được thay đổi, nhưng đối tượng được sử dụng cho "test" được thay đổi.

Hãy thử thay thế.

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

Trong trường hợp này, sản lượng trong Java 7 update 7 là

String object the same is: test 

nhưng chạy trên Java 6 update 32 hoặc bỏ ghi chú dòng để "test" được xem đầu tiên và bạn nhận được.

String object the same is: false 
+0

Nhưng nó đang thay đổi tham chiếu chuỗi ban đầu. Tôi đang sử dụng JDK7. –

+1

Những gì bạn đang đề xuất là không thể trong Java cho bất kỳ phương pháp như vậy, không có nó không phải là. –

+0

@AmitD Đã thêm ví dụ để chứng minh sự khác biệt. Nó là chuỗi ký tự được thay đổi, không phải chuỗi ký tự 'username' của bạn. –

2

str.intern() kiểm tra xem liệu đã có cùng một đối tượng trong nhóm Chuỗi và nếu có, hãy sử dụng lại nó.

+1

Đó là chính xác, tuy nhiên tham chiếu trả lại phải là chuỗi gộp. Nó không nên thay đổi tham chiếu từ bên trong phương thức. –

0

Dòng dưới đây cung cấp cho bạn người dùng biểu mẫu nhập.

username = user_input.next(); 

Sau đó bạn đang gọi username.intern(); mà trả về chuỗi đen của username
Bây giờ trong tuyên bố tình trạng của bạn

if (username == "test") 

biến của bạn username chứa đối tượng String literal của bạn từ hồ bơi chuỗi và "test" cũng là một Chuỗi chữ để jvm sẽ cung cấp cho bạn tham chiếu tương tự của Chuỗi test đã được tạo cho username có nghĩa là username"test" là cùng một đối tượng. Và trong java == hoạt động tham khảo kiểm cho các đối tượng như vậy trong trường hợp này nó sẽ trở lại true thats tại sao bản in của nó okay

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