1. Compararea corzilor

Toate acestea sunt bine și bune. Dar puteți vedea că șirurile s1și s2sunt de fapt aceleași, ceea ce înseamnă că conțin același text. Când comparați șirurile de caractere, cum îi spuneți programului să nu se uite la adresele obiectelor String, ci la conținutul acestora?

Pentru a ne ajuta în acest sens, clasa Java Stringare equalsmetoda. Apelarea arată astfel:

string1.equals(string2)
Comparând două șiruri

Această metodă returnează truedacă șirurile sunt aceleași și falsedacă nu sunt aceleași.

Exemplu:

Cod Notă
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

Mai multe exemple:

Cod Explicaţie
"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. Compararea șirurilor de caractere care nu ține seama de majuscule și minuscule

În ultimul exemplu, ați văzut că comparația dă . Într-adevăr, șirurile nu sunt egale. Dar..."Hello".equals("HELLO")false

În mod clar, șirurile nu sunt egale. Acestea fiind spuse, conținutul lor are aceleași litere și diferă doar prin cazul literelor. Există vreo modalitate de a le compara și de a ignora cazul literelor? Adică, astfel încât randamentele ?"Hello".equals("HELLO")true

Și răspunsul la această întrebare este da. În Java, Stringtipul are o altă metodă specială: equalsIgnoreCase. Apelarea arată astfel:

string1.equalsIgnoreCase(string2)

Numele metodei se traduce aproximativ ca compara, dar ignora majuscule . Literele din numele metodei includ două linii verticale: prima este o literă mică L, iar a doua este o literă mare i. Nu lăsa asta să te încurce.

Exemplu:

Cod Notă
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. Exemplu de comparație de șiruri

Să dăm doar un exemplu simplu: să presupunem că trebuie să introduceți două linii de la tastatură și să determinați dacă sunt aceleași. Iată cum va arăta codul:

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. O nuanță interesantă a comparației șirurilor

Există o nuanță importantă de care trebuie să fii conștient.

Dacă compilatorul Java găsește mai multe șiruri identice în codul dvs. (în special în codul dvs.), atunci va crea doar un singur obiect pentru ele pentru a economisi memorie.

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

Și iată ce va conține memoria ca rezultat:

comparație de șiruri

Și dacă comparați text == messageaici, atunci obțineți true. Deci nu fi surprins de asta.

Dacă dintr-un motiv oarecare aveți nevoie într-adevăr ca referințele să fie diferite, atunci puteți scrie asta:

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

Sau asta:

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

În ambele cazuri, variabilele textși messageindică obiecte diferite care conțin același text.