Programımda şimdiye kadar tüm dizgilerimi karşılaştırmak için ==' operatörünü kullandım. Ancak, bir hata ile karşılaştım, bunlardan birini
.equals()` olarak değiştirdim ve hata düzeldi.
===` kötü mü? Ne zaman kullanılmalı ve kullanılmamalı? Aradaki fark nedir?
==
referans eşitliğini (aynı nesne olup olmadıklarını) test eder.
.equals()` değer eşitliğini test eder (mantıksal olarak "eşit" olup olmadıklarını).
Objects.equals() .equals()
işlevini çağırmadan önce null
olup olmadığını kontrol eder, böylece bunu yapmak zorunda kalmazsınız (JDK7'den itibaren mevcuttur, Guava'da da mevcuttur).
String.contentEquals() String
in içeriğini herhangi bir CharSequence
in içeriğiyle karşılaştırır (Java 1.5'ten beri mevcuttur).
Sonuç olarak, iki dizenin aynı değere sahip olup olmadığını test etmek istiyorsanız, muhtemelen Objects.equals()
kullanmak isteyeceksiniz.
// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
Neredeyse her zaman Objects.equals()
kullanmak istersiniz. Nadir durumlarda, interned stringleri ile uğraştığınızı bildiğinizde, ==
kullanabilirsiniz.
JLS 3.10.5. String Literals](https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-3.10.5) adresinden:
Ayrıca, bir string literal her zaman String
sınıfının aynı örneğini ifade eder. Bunun nedeni, string değişmezlerinin - ya da daha genel olarak, sabit ifadelerin değerleri olan stringlerin (§15.28) - String.intern
yöntemi kullanılarak benzersiz örnekleri paylaşacak şekilde "interned" edilmesidir.
Benzer örnekler [JLS 3.10.5-1]'de de bulunabilir (https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#d5e1634).
Evet, ==
String'leri (kanonik olduklarını bilmediğiniz sürece herhangi bir nesneyi) karşılaştırmak için kötüdür. ===sadece nesne referanslarını karşılaştırır. .equals()
eşitliği test eder. Stringler için, genellikle aynı olacaklardır, ancak keşfettiğiniz gibi, bu her zaman garanti edilmez.
==
Java'da nesne referanslarını karşılaştırır ve bu String
nesneleri için bir istisna değildir.
Nesnelerin (String
dahil) gerçek içeriklerini karşılaştırmak için equals
yöntemi kullanılmalıdır.
İki String
nesnesinin ==
kullanılarak karşılaştırılması doğru
çıkarsa, bunun nedeni String
nesnelerinin iç içe geçmiş olması ve Java Sanal Makinesinin birden fazla referansı aynı String
örneğine işaret ettirmesidir. Aynı içeriği içeren bir String
nesnesini ==
kullanarak başka bir String
nesnesiyle karşılaştırmanın true
olarak değerlendirilmesi beklenmemelidir.