Sự khác biệt giữa == và bằng làm tôi bối rối đôi khi cho đến khi tôi quyết định xem xét kỹ hơn về nó. Nhiều người trong số họ nói rằng để so sánh chuỗi bạn nên sử dụng equals
và không ==
. Hy vọng trong câu trả lời này tôi sẽ có thể nói sự khác biệt.
Cách tốt nhất để trả lời câu hỏi này sẽ là bằng cách tự hỏi một vài câu hỏi. vì vậy hãy bắt đầu:
Đầu ra cho chương trình dưới đây là gì:
String mango = "mango";
String mango2 = "mango";
System.out.println(mango != mango2);
System.out.println(mango == mango2);
nếu bạn nói,
false
true
Tôi sẽ nói bạn đúng nhưng tại sao bạn lại nói vậy ? và nếu bạn nói đầu ra là,
true
false
Tôi sẽ nói bạn là sai nhưng tôi vẫn sẽ hỏi bạn, tại sao bạn nghĩ điều đó đúng?
Ok, chúng ta hãy thử trả lời câu hỏi này:
Đầu ra cho chương trình dưới đây là gì:
String mango = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango3);
System.out.println(mango == mango3);
Bây giờ nếu bạn nói,
false
true
Tôi sẽ nói bạn sai nhưng tại sao bây giờ lại sai ? đầu ra chính xác cho chương trình này là
true
false
Hãy so sánh chương trình trên và cố gắng nghĩ về nó.
Đồng ý. Bây giờ điều này có thể giúp (xin vui lòng đọc điều này: in địa chỉ của đối tượng - không thể nhưng chúng ta vẫn có thể sử dụng nó.)
String mango = "mango";
String mango2 = "mango";
String mango3 = new String("mango");
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(mango3 != mango2);
System.out.println(mango3 == mango2);
// mango2 = "mang";
System.out.println(mango+" "+ mango2);
System.out.println(mango != mango2);
System.out.println(mango == mango2);
System.out.println(System.identityHashCode(mango));
System.out.println(System.identityHashCode(mango2));
System.out.println(System.identityHashCode(mango3));
bạn có thể thử nghĩ về đầu ra của ba dòng cuối cùng trong đoạn mã trên không: đối với tôi, ideone đã in nó ra ( bạn có thể kiểm tra mã ở đây ):
false
true
true
false
mango mango
false
true
17225372
17225372
5433634
Oh! Bây giờ bạn nhìn thấy nhận dạngHashCode (xoài) bằng với idHashCode (mango2) Nhưng nó không bằng nhận dạngHashCode (mango3)
Mặc dù tất cả các biến chuỗi - xoài, xoài2 và xoài3 - có cùng một giá trị, đó là "xoài",identityHashCode()
vẫn không giống nhau cho tất cả.
Bây giờ hãy thử bỏ dòng này // mango2 = "mang";
và chạy lại lần này bạn sẽ thấy cả baidentityHashCode()
đều khác nhau. Hmm đó là một gợi ý hữu ích
chúng tôi biết rằng nếu hashcode(x)=N
và hashcode(y)=N
=>x is equal to y
Tôi không chắc làm thế nào java hoạt động nội bộ nhưng tôi cho rằng đây là những gì đã xảy ra khi tôi nói:
mango = "mango";
java đã tạo ra một chuỗi "mango"
được chỉ (tham chiếu) bởi biến mango
như thế này
mango ----> "mango"
Bây giờ trong dòng tiếp theo khi tôi nói:
mango2 = "mango";
Nó thực sự sử dụng lại cùng một chuỗi "mango"
trông giống như thế này
mango ----> "mango" <---- mango2
Cả xoài và xoài2 đều chỉ đến cùng một tham chiếu Bây giờ khi tôi nói
mango3 = new String("mango")
Nó thực sự tạo ra một tham chiếu (chuỗi) hoàn toàn mới cho "xoài". trông giống như thế này,
mango -----> "mango" <------ mango2
mango3 ------> "mango"
và đó là lý do tại sao khi tôi đưa ra các giá trị cho mango == mango2
nó, nó đưa ra true
. và khi tôi đưa ra giá trị cho mango3 == mango2
nó, nó đưa ra false
(ngay cả khi các giá trị là như nhau).
và khi bạn bỏ ghi chú dòng // mango2 = "mang";
Nó thực sự tạo ra một chuỗi "mang" đã biến đồ thị của chúng tôi như thế này:
mango ---->"mango"
mango2 ----> "mang"
mango3 -----> "mango"
Đây là lý do tại sao nhận dạngHashCode không giống nhau cho tất cả.
Hy vọng điều này sẽ giúp các bạn. Trên thực tế, tôi muốn tạo một trường hợp thử nghiệm trong đó == fail và bằng () vượt qua. Xin vui lòng bình luận và cho tôi biết nếu tôi sai.