Tôi đã tìm thấy một trường hợp thú vị trong khi thử nghiệm bằng tạo chuỗi và kiểm tra mã băm của chúng.Thử nghiệm với việc tạo chuỗi
Trong trường hợp đầu tiên tôi tạo ra chuỗi sử dụng bản sao constructor:
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
String s1 = new String("myTestString");
String s3 = s1.intern();
System.out.println("S1: " + System.identityHashCode(s1) + " S3:"
+ System.identityHashCode(s3));
}
}
Output mã trên là:
S1: 816.115.710 S3: 478684581
này dự kiến sản lượng như chuỗi tập trung chọn tham chiếu từ nhóm Chuỗi trong khi s1 chọn tham chiếu của đối tượng mới. Vì vậy, mã băm nhận dạng của chúng khác nhau.
Bây giờ nếu tôi tạo ra chuỗi sử dụng mảng char sau đó tôi nhìn thấy một số hành vi kỳ lạ:
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
char[] c1 = { 'm', 'y', 'T', 'e', 's', 't', 'S', 't', 'r', 'i', 'n',
'g' };
String s5 = new String(c1);
String s6 = s5.intern();
System.out.println("S5: " + System.identityHashCode(s5) + " S6:"
+ System.identityHashCode(s6));
}
}
Output mã trên là:
S5: 816.115.710 S6: 816115710
Đây là một đầu ra không mong muốn. Làm thế nào có thể tập trung String và đối tượng String mới có cùng một identityhashcode ??
Bất kỳ ý tưởng nào?
Hãy xem http://stackoverflow.com/questions/1063068/how -does-the-jvm-đảm bảo-rằng-system-identityhashcode-sẽ-không bao giờ thay đổi –
@IgorS .: Làm thế nào nó được liên kết với câu hỏi của tôi? – Lokesh
"Nhiều đối tượng có thể có cùng mã băm nhận dạng. Đó là bản chất của mã băm". –