Strings in Java vergleichen

Vergleichen von Strings in Java

1. Überblick

In diesem Artikel werden die verschiedenen Möglichkeiten zum Vergleichen vonStrings in Java erläutert.

DaString einer der am häufigsten verwendeten Datentypen in Java ist, ist dies natürlich eine sehr häufig verwendete Operation.

2. String Vergleich mitString Klasse

2.1. Verwenden des Vergleichsoperators“==”

Die Verwendung des Operators "==" zum Vergleichen von Textwerten ist einer der häufigsten Fehler, die Java-Anfänger machen. Dies ist falsch, da“==” only checks the referential equality of two Strings,bedeutet, ob sie auf dasselbe Objekt verweisen oder nicht.

Sehen wir uns ein Beispiel für dieses Verhalten an:

String string1 = "using comparison operator";
String string2 = "using comparison operator";
String string3 = new String("using comparison operator");

assertThat(string1 == string2).isTrue();
assertThat(string1 == string3).isFalse();

Im obigen Beispiel ist die erste Behauptung wahr, da die beiden Variablen auf dasselbeString-Literal verweisen.

Andererseits ist die zweite Behauptung falsch, weilstring1 mit einem Literal erstellt wird undstring3 mit dem Operatornew erstellt wird - daher verweisen sie auf verschiedene Objekte.

2.2. Verwenden vonequals()

Die KlasseString überschreibt dieequals(), die vonObject.This method compares two Strings character by character, ignoring their address. geerbt wurden

Es betrachtet sie als gleich, wenn sie gleich lang sind und die Zeichen in derselben Reihenfolge stehen:

String string1 = "using equals method";
String string2 = "using equals method";

String string3 = "using EQUALS method";
String string4 = new String("using equals method");

assertThat(string1.equals(string2)).isTrue();
assertThat(string1.equals(string4)).isTrue();

assertThat(string1.equals(null)).isFalse();
assertThat(string1.equals(string3)).isFalse();

In diesem Beispiel sind die Variablenstring1, string2, undstring4 gleich, da sie unabhängig von ihrer Adresse den gleichen Fall und Wert haben.

Fürstring3 gibt die Methodefalse, zurück, da zwischen Groß- und Kleinschreibung unterschieden wird.

Wenn eine der beiden Zeichenfolgennull ist, gibt die Methodefalse. zurück

2.3. Verwenden vonequalsIgnoreCase()

Die MethodeequalsIgnoreCase() gibt einen booleschen Wert zurück. Wie der Name schon sagt, ist diese Methodeignores casing in characters while comparing Strings:

String string1 = "using equals ignore case";
String string2 = "USING EQUALS IGNORE CASE";

assertThat(string1.equalsIgnoreCase(string2)).isTrue();

2.4. Verwenden voncompareTo()

Die MethodecompareTo() gibt einen Typwert vonintundcompares two Strings character by character lexicographically basierend auf einem Wörterbuch oder einer natürlichen Reihenfolge zurück.

Diese Methode gibt 0 zurück, wenn zweiStringsgleich sind, oder wenn beidenull,eine negative Zahl sind, wenn das ersteString vor dem Argument steht, und eine Zahl größer als Null, wenn das ersteString kommt nach dem ArgumentString.

Sehen wir uns ein Beispiel an:

String author = "author";
String book = "book";
String duplicateBook = "book";

assertThat(author.compareTo(book))
  .isEqualTo(-1);
assertThat(book.compareTo(author))
  .isEqualTo(1);
assertThat(duplicateBook.compareTo(book))
  .isEqualTo(0);

2.5. Verwenden voncompareToIgnoreCase()

compareToIgnoreCase() ähnelt der vorherigen Methode, ignoriert jedoch den Fall:

String author = "Author";
String book = "book";
String duplicateBook = "BOOK";

assertThat(author.compareToIgnoreCase(book))
  .isEqualTo(-1);
assertThat(book.compareToIgnoreCase(author))
  .isEqualTo(1);
assertThat(duplicateBook.compareToIgnoreCase(book))
  .isEqualTo(0);

3. String Vergleich mitObjects Klasse

Objects ist eine Dienstprogrammklasse, die eine statischeequals()-Methode enthält, die in diesem Szenario nützlich ist, um zweiStrings. zu vergleichen

Die Methode gibttrue zurück, wenn zweiStrings gleichfirstcomparing them using their address sind, d. H.==”. Wenn beide Argumentenull sind, wird folglichtrue zurückgegeben, und wenn genau ein Argumentnull ist, wird false zurückgegeben.

Andernfalls ruft es einfach die Methodeequals()der Klasse des Typs des übergebenen Arguments auf - in unserem Fall die MethodeString’sder Klasseequals(). Bei dieser Methode wird zwischen Groß- und Kleinschreibung unterschieden, da intern dieequals()-Methode der KlasseStringaufgerufen wird.

Testen wir dies:

String string1 = "using objects equals";
String string2 = "using objects equals";
String string3 = new String("using objects equals");

assertThat(Objects.equals(string1, string2)).isTrue();
assertThat(Objects.equals(string1, string3)).isTrue();

assertThat(Objects.equals(null, null)).isTrue();
assertThat(Objects.equals(null, string1)).isFalse();

4. String Vergleich mitApache Commons

The Apache Commons library contains a utility class called StringUtils for String-related operations; Dies hat auch einige sehr vorteilhafte Methoden für den Vergleich vonString.

4.1. Verwenden vonequals() and equalsIgnoreCase ()

Dieequals()-Methode derStringUtils-Klasse ist eine erweiterte Version derString-Klassenmethodeequals(),, die auch Nullwerte verarbeitet:

assertThat(StringUtils.equals(null, null))
  .isTrue();
assertThat(StringUtils.equals(null, "equals method"))
  .isFalse();
assertThat(StringUtils.equals("equals method", "equals method"))
  .isTrue();
assertThat(StringUtils.equals("equals method", "EQUALS METHOD"))
  .isFalse();

DieequalsIgnoreCase()-Methode vonStringUtils gibt einenboolean-Wert zurück. Dies funktioniert ähnlich wieequals(),, außer dass die Groß- und Kleinschreibung von Zeichen inStrings: ignoriert wird

assertThat(StringUtils.equalsIgnoreCase("equals method", "equals method"))
  .isTrue();
assertThat(StringUtils.equalsIgnoreCase("equals method", "EQUALS METHOD"))
  .isTrue();

4.2. MitequalsAny() und equalsAnyIgnoreCase ()

Das erste Argument derequalsAny()-Methode istString und das zweite ist ein Multi-Args-TypCharSequence.. Die Methode gibttrue zurück, wenn eines der anderen angegebenenStrings übereinstimmt gegen den erstenString Fall empfindlich.

Andernfalls wird false zurückgegeben:

assertThat(StringUtils.equalsAny(null, null, null))
  .isTrue();
assertThat(StringUtils.equalsAny("equals any", "equals any", "any"))
  .isTrue();
assertThat(StringUtils.equalsAny("equals any", null, "equals any"))
  .isTrue();
assertThat(StringUtils.equalsAny(null, "equals", "any"))
  .isFalse();
assertThat(StringUtils.equalsAny("equals any", "EQUALS ANY", "ANY"))
  .isFalse();

DieequalsAnyIgnoreCase()-Methode funktioniert ähnlich wie dieequalsAny()-Methode, ignoriert jedoch auch das Gehäuse:

assertThat(StringUtils.equalsAnyIgnoreCase("ignore case", "IGNORE CASE", "any")).isTrue();

4.3. Mitcompare() und compareIgnoreCase ()

Diecompare()-Methode in derStringUtils-Klasse ist einenull-safe version of the compareTo()-Methode derString-Klasse und behandeltnull-Werte mitconsidering a null value less than a non-null value. Zweinull-Werten gelten als gleich.

Darüber hinaus kann diese Methode verwendet werden, um eine Liste vonStrings mitnull Einträgen zu sortieren:

assertThat(StringUtils.compare(null, null))
  .isEqualTo(0);
assertThat(StringUtils.compare(null, "abc"))
  .isEqualTo(-1);
assertThat(StringUtils.compare("abc", "bbc"))
  .isEqualTo(-1);
assertThat(StringUtils.compare("bbc", "abc"))
  .isEqualTo(1);

Die MethodecompareIgnoreCase()verhält sich ähnlich, außer dass das Gehäuse ignoriert wird:

assertThat(StringUtils.compareIgnoreCase("Abc", "bbc"))
  .isEqualTo(-1);
assertThat(StringUtils.compareIgnoreCase("bbc", "ABC"))
  .isEqualTo(1);
assertThat(StringUtils.compareIgnoreCase("abc", "ABC"))
  .isEqualTo(0);

Die beiden Methoden können auch mit der OptionnullIsLess verwendet werden. Dies ista third boolean argument which decides if null values should be considered less or not.

Einnull-Wert ist niedriger als ein andererString, wennnullIsLess wahr ist, und höher, wennnullIsLess falsch ist.

Probieren wir es aus:

assertThat(StringUtils.compare(null, "abc", true))
  .isEqualTo(-1);
assertThat(StringUtils.compare(null, "abc", false))
  .isEqualTo(1);

Die MethodecompareIgnoreCase() mit einem dritten Argumentbooleanfunktioniert ähnlich, außer dass Groß- und Kleinschreibung ignoriert wird.

5. Fazit

In diesem kurzen Tutorial haben wir verschiedene Möglichkeiten zum Vergleichen vonStrings. besprochen

Und wie immer kann der Quellcode für die Beispieleover on GitHub gefunden werden.