1. Strings vergelijken

Dit is allemaal goed en wel. Maar je kunt zien dat de strings s1en s2eigenlijk hetzelfde zijn, wat betekent dat ze dezelfde tekst bevatten. Hoe vertel je het programma bij het vergelijken van strings om niet naar de adressen van Stringobjecten te kijken, maar naar hun inhoud?

Om ons hierbij te helpen, Stringheeft de klasse van Java de equalsmethode. Bellen ziet er zo uit:

string1.equals(string2)
Twee snaren vergelijken

Deze methode retourneert trueof de strings hetzelfde zijn, en falseals ze niet hetzelfde zijn.

Voorbeeld:

Code Opmerking
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

Meer voorbeelden:

Code Uitleg
"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. Vergelijking van tekenreeksen die niet hoofdlettergevoelig zijn

In het laatste voorbeeld zag je dat de vergelijking . De snaren zijn inderdaad niet gelijk. Maar..."Hello".equals("HELLO")false

Het is duidelijk dat de snaren niet gelijk zijn. Dat gezegd hebbende, hun inhoud heeft dezelfde letters en verschilt alleen per letter. Is er een manier om ze te vergelijken en het geval van de letters buiten beschouwing te laten? Dat wil zeggen, dus dat levert ?"Hello".equals("HELLO")true

En het antwoord op deze vraag is ja. In Java Stringheeft het type nog een speciale methode: equalsIgnoreCase. Bellen ziet er zo uit:

string1.equalsIgnoreCase(string2)

De naam van de methode vertaalt zich ruwweg als vergelijk maar negeer hoofdlettergebruik . De letters in de naam van de methode bevatten twee verticale lijnen: de eerste is een kleine letter Len de tweede is een hoofdletter i. Laat je daardoor niet verwarren.

Voorbeeld:

Code Opmerking
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. Voorbeeld van stringvergelijking

Laten we een eenvoudig voorbeeld geven: stel dat u twee regels met het toetsenbord moet invoeren en moet bepalen of ze hetzelfde zijn. Dit is hoe de code eruit zal zien:

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. Een interessante nuance van snaarvergelijking

Er is één belangrijke nuance waarvan u op de hoogte moet zijn.

Als de Java-compiler meerdere identieke strings in uw code aantreft (met name in uw code), dan zal het slechts een enkel object voor hen maken om geheugen te besparen.

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

En dit is wat het geheugen als resultaat zal bevatten:

string vergelijking

En als je text == messagehier vergelijkt, dan krijg je true. Wees daar dus niet verbaasd over.

Als je om wat voor reden dan ook echt wilt dat de referenties anders zijn, dan kun je dit schrijven:

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

Of dit:

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

In beide gevallen verwijzen de variabelen texten messagenaar verschillende objecten die dezelfde tekst bevatten.