Как да сравня стрингове – с “.equals” или с “==”??

+4 гласа
239 прегледа
попитан 2016 март 30 от Nikola.Nikolov. (3,100 точки)
етикетиран отново 2016 април 1 от Mitko Vasilev

Досега съм използвала операторът „==” в програмата си,но май има бъг,смених един от тях в .equals() и то оправи бъга.

Нещо не ми е ясно - „==“ не е добър начин за сравняване ли ? И кога и кога не трябва да се използва? Каква е разликата? 

1 отговор

+1 глас
отговорени 2016 март 30 от Daniel Ivanov (11,160 точки)

Така,
“==” тества за еднаквост в референциите (проверяваме дали са един и същ обект),

докато .equals() проверява за еднаквост на самите стойности (дали са логически

„еднакви“).

 (http://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#equals%28java.lang.Object,%20java.lang.Object%29)

Objects.equals() проверява за null-ове преди call-ването на .equals() ,така че няма смисъл да проверяваш.

Ако искаш постепенно да провереяваш дали 2 стринга са с една и съща стойност (value),ще трябва да използваш Objects.equals().

// Тези са с 1 и съща стойност (value)

new String("test").equals("test") // --> true

// ... но не са същия обект

new String("test") == "test" // --> false

// ... нито пък тези

new String("test") == new String("test") // --> false

// ... но тези са защото литералите са ограничени от

// компилатора и от това следва,че са референции към 1 и същ обект

"test" == "test" // --> true

// ... просто използвай Objects.equals()

Objects.equals("test", new String("test")) // --> true

Objects.equals(null, "test") // --> false

Почти винаги използвай Objects.equals(). Рядко ще ти се наложи да използваш “==“,например когато знаеш,че сравняваш ограничени стрингове.

Забележка:
Внимавай за null : Kогато използваш “==”,той си го handle-ва без проблеми,но ползваш ли .equals() с null стринг,ще ти даде exception:

String nullString1 = null;
String nullString2 = null;
// Тrue
nullString1 == nullString2;
// Throws an Exception
nullString1.equals(nullString2);

Като цяло това трябва да ти е предостатъчно като информация :)

...