Porównywanie obiektów String

Spis treści

Porównywanie obiektów typu String często sprawia problemy początkującym programistom, którzy robią to w niepoprawny sposób. Jednocześnie jest to jedno z pytań, które pozwala na rozmowie kwalifikacyjnej od razu sprawdzić, czy ktoś dopiero zaczyna naukę Javy, czy już wie o co chodzi. Poniżej znajdziesz krótką zagadkę dotyczącą porównywania obiektów typu String i "nieoczekiwanych" wyników z tym związanych.

Kurs Java

No więc zadeklarujmy kilka Stringów, a następnie wyświetlmy wynik ich porównywania za pomocą operatora ==, a także metody equals() klasy String.

Pytanie brzmi, co zobaczymy na ekranie po wykonaniu poniższego kodu?

public class Test {
 	public static void main(String args[]){
 		String s1 = "Ala";
 		String s2 = "Ala";
 		System.out.println(s1==s2);
 		System.out.println(s1.equals(s2));
 
 		String s3 = s1;
 		String s4 = new String("Ala");
 		System.out.println(s3==s4);
 		System.out.println(s3.equals(s4));
 	}
 }

Dostępne odpowiedzi to:

A) true true true true

B) false true false true

C) true true false true

D) false false false false

Rozwiązanie

Pytanie dotyczyło poniżej przedstawionego kodu, a konkretnie, co pokaże się na ekranie po uruchomieniu kodu:

public class Test {
 	public static void main(String args[]){
 		String s1 = "Ala";
 		String s2 = "Ala";
 		System.out.println(s1==s2);
 		System.out.println(s1.equals(s2));
 
 		String s3 = s1;
 		String s4 = new String("Ala");
 		System.out.println(s3==s4);
 		System.out.println(s3.equals(s4));
 	}
 }

Poprawna odpowiedź to: C) true true false true.

Zadać można pytanie dlaczego akurat tak? Przecież utworzyliśmy 4 obiekty typu String, które nie mają ze sobą związku. Metoda equals(), porównuje ogólnie w przypadku typów obiektowych (w zależności od tego jak została zdefiniowana) równość wewnętrznych pól obiektu. W przypadku Stringów sprawdzamy za jej pomocą, czy napis "Ala" równy jest innemu napisowi "Ala". No więc 2 z 4 wartości powinny być teraz oczywiste.

Ale zaraz, dlaczego porównanie s1==s2 zwraca true? Przecież to jest operator sprawdzający równość fizyczną, a nie strukturalną. Wszystko rozbija się w tym przypadku o działanie wirtualnej maszyny. Stringi, które są dokładnie takie same, są przez maszynę wirtualną lokowane w jednym miejscu pamięci (całkiem sprytne), dlatego porównanie dwóch takich samych napisów w Javie za pomocą operatora == zwróci nam true.

W takim razie, dlaczego przy porównaniu s3==s4 mamy już wartość false ? Przy tworzeniu obiektu s4 użyliśmy słowa kluczowego new - tym samym wymusiliśmy utworzenie nowego, niezależnegoobiektu. W tym przypadku mimo, iż jest to nadal ten sam napis "Ala" to jest już w całkiem innym miejscu pamięci.

Także dla pewności zawsze używaj do porównywanie zarówno obiektów jak i Stringów metody equals(). Dobrze zdefiniowana w pierwszej kolejności sprawdza właśnie równość fizyczną dwóch obiektów, także nie musisz się zbytnio martwić o to, że zużyje ona więcej zasobów.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.