CodeGym /Kursy /All lectures for PL purposes /Porównywanie ciągów według zawartości

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

All lectures for PL purposes
Poziom 1, Lekcja 673
Dostępny

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.



Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION