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
s
vàt
,s.intern() == t.intern()
là đúng nếu và chỉ khis.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");
}
}
}
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. –
@ JoachimSauer thật thú vị. Chỉ cần thử nó với Java7 mới nhất. –
Đã thử với java 6 và in "không ổn". – dcernahoschi