1. Porównanie ciągów znaków

Wszystko jest świetne. Ale widać, że linie s1i s2są właściwie takie same - zawierają ten sam tekst. Jak powiedzieć programowi, że porównując napisy, nie patrzy na adresy obiektów String, ale na ich zawartość?

Aby to zrobić, w Javie typ Stringma specjalną metodę - equals. Wezwanie wygląda następująco:

string1.equals(string2)
Porównanie dwóch ciągów znaków

Ta metoda zwraca true(true), jeśli łańcuchy są takie same i false(false), jeśli nie są takie same.

Przykład:

Kod: Notatka
String s1 = "Hello";
String s2 = "HELLO";
String s3 = s1.toUpperCase();

System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s2.equals(s3));
// Hello
// HELLO
// HELLO

false // They are different
false // They are different
true // They are the same, even though the addresses are different

Więcej przykładów:

Kod Wyjaśnienie
"Hello".equals("HELLO")
false
String s = "Hello";
"Hello".equals(s);
true
String s = "Hel";
"Hello".equals(s + "lo");
true
String s = "H";
(s + "ello").equals(s + "ello");
true


2. Porównywanie ciągów bez rozróżniania wielkości liter

W ostatnim przykładzie widziałeś, że porównanie daje . Rzeczywiście, linie nie są równe. Chociaż..."Hello".equals("HELLO")false

Wiersze oczywiście nie są równe, ale jest w nich napisane to samo, tylko rozmiar (wielkość liter) jest inny. Czy jest jakiś sposób, aby je porównać, aby rozmiar liter nie był brany pod uwagę? Cóż, dać ?"Hello".equals("HELLO")true

A odpowiedź na to pytanie brzmi: tak. W Javie typ Stringma inną specjalną metodę - equalsIgnoreCase. Wezwanie wygląda następująco:

string1.equalsIgnoreCase(string2)

Nazwa metody jest tłumaczona jako porównaj, ignorując wielkość liter . W nazwie metody są dwie kreski pionowe: pierwsza to Lmała, a druga to itylko duża. Nie myl.

Przykład:

Kod: Notatka
String s1 = "Hello";
String s2 = "HELLO";
String s3 = s1.toUpperCase();

System.out.println(s1.equalsIgnoreCase(s2));
System.out.println(s1.equalsIgnoreCase(s3));
System.out.println(s2.equalsIgnoreCase(s3));  
// Hello
// HELLO
// HELLO

true
true
true


3. Przykład porównania ciągów znaków

Podajmy tylko jeden prosty przykład: musisz wprowadzić dwie linie z klawiatury i ustalić, czy są one takie same, czy nie. Oto jak wyglądałby ten kod:

Scanner console = new Scanner(System.in);
String a = console.nextLine();
String b = console.nextLine();
String result = a.equals(b) ? "Same" : "Different";
System.out.println(result);

4. Ciekawy niuans porównania strun

Jest jeden ważny niuans, o którym musisz wiedzieć.

Jeśli kompilator Java znajdzie kilka identycznych linii w twoim kodzie (mianowicie w kodzie), utworzy dla nich tylko jeden obiekt, aby zaoszczędzić pamięć.

String text = "This is a very important message";
String message = "This is a very important message";

A oto, co w rezultacie zostanie w pamięci:

Porównywanie ciągów według zawartości

A jeśli w tym przypadku porównasz ze sobą text == message, otrzymasz true. Więc nie bądź zaskoczony.

A jeśli nagle naprawdę potrzebujesz, aby linki były inne, możesz napisać to:

String text = "This is a very important message";
String message = new String ("This is a very important message");

Lub tak:

String text = "This is a very important message";
String message = new String (text);

W obu przypadkach zmienne texti messagewskazują różne obiekty zawierające ten sam tekst.