1. 概要

この記事では、JavaでStringsを比較するさまざまな方法について説明します。

String はJavaで最もよく使用されるデータ型の1つであるため、これは当然、非常に一般的に使用される操作です。

2. String Stringクラスとの比較

2.1. “ ==”比較演算子の使用

テキスト値を比較するために「==」演算子を使用することは、Java初心者が犯す最も一般的な間違いの1つです。 “ ==”は、2つの文字列 の参照の同等性のみをチェックするため、これは正しくありません。つまり、同じオブジェクトを参照しているかどうかを意味します。

この動作の例を見てみましょう。

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();

上記の例では、2つの変数が同じ String リテラルを指しているため、最初のアサーションはtrueです。

一方、 string1 はリテラルで作成され、string3new演算子を使用して作成されるため、2番目のアサーションはfalseです。したがって、これらは異なるオブジェクトを参照します。

2.2. equals()の使用

Theクラスは equals() から継承物体。 このメソッドは、アドレスを無視して、2つの文字列を1文字ずつ比較します。

それらが同じ長さであり、文字が同じ順序である場合、それらは等しいと見なされます。

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();

この例では、 string1、string2、、および string4 変数は、アドレスに関係なく大文字と小文字と値が同じであるため、等しくなります。

string3 の場合、大文字と小文字が区別されるため、メソッドは false、を返します。

また、2つの文字列のいずれかが null の場合、メソッドはfalseを返します。

2.3. equalsIgnoreCase()の使用

equalsIgnoreCase()メソッドはブール値を返します。 名前が示すように、このメソッドは、文字列を比較するときに文字の大文字小文字の区別を無視します

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

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

2.4. compareTo()を使用する

compareTo()メソッドは int 型の値を返し、は辞書式順序または自然な順序に基づいて2つの文字列を文字ごとに比較します

このメソッドは、2つの Strings が等しい場合、または両方が nullの場合、最初の String が引数の前にある場合は負の数、およびより大きい数の場合は0を返します。最初のStringが引数String。の後に来る場合はゼロ

例を見てみましょう:

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. compareToIgnoreCase()を使用する

compareToIgnoreCase()は、大文字と小文字を区別しないことを除いて、前のメソッドと同様です。

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 Objectsクラスとの比較

Objects は、静的な equals()メソッドを含むユーティリティクラスであり、このシナリオで役立ちます–2つの文字列を比較します。

このメソッドは、2つの文字列最初の と等しい場合、アドレスすなわち「 ==」を使用してそれらを比較すると、trueを返します。 ]。 したがって、両方の引数が null の場合は、 true を返し、1つの引数が null の場合は、falseを返します。

それ以外の場合は、渡された引数の型のクラスの equals()メソッドを呼び出すだけです。この場合はStringのクラスequals()メソッドです。 このメソッドは、 Stringクラスのequals()メソッドを内部的に呼び出すため、大文字と小文字が区別されます。

これをテストしてみましょう:

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 ApacheCommonsとの比較

Apache Commonsライブラリには、文字列関連の操作用のStringUtilsと呼ばれるユーティリティクラスが含まれています。 これには、Stringの比較に非常に有益な方法もいくつかあります。

4.1. equals()および equalsIgnoreCase()の使用

StringUtilsクラスのequals()メソッドは、 Stringクラスメソッドequals()、の拡張バージョンであり、null値も処理します。 :

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();

StringUtilsequalsIgnoreCase()メソッドは、boolean値を返します。 これは、 equals()、と同様に機能しますが、 Strings:の文字の大文字小文字の区別を無視する点が異なります。

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

4.2. equalsAny()および equalsAnyIgnoreCase()の使用

The equalsAny() メソッドの最初の引数は 2番目は複数引数タイプです CharSequence。 メソッドは真実他のいずれかが与えられた場合文字列最初の試合と対戦敏感にケース。

それ以外の場合は、falseが返されます。

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();

equalsAnyIgnoreCase()メソッドは、 equalsAny()メソッドと同様に機能しますが、大文字と小文字も無視します。

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

4.3. compare()および compareIgnoreCase()の使用

The 比較() の方法 StringUtils クラスはヌルセーフバージョンのcompareTo() の方法クラスとハンドルヌルによる値 null以外の値よりも小さいnull値を考慮します。 ヌル値は等しいと見なされます。

さらに、このメソッドを使用して、文字列のリストをnullエントリで並べ替えることができます。

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);

compareIgnoreCase()メソッドは、大文字と小文字を無視することを除いて、同様に動作します。

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

2つのメソッドは、nullIsLessオプションで使用することもできます。 これはヌル値を少なくするかどうかを決定する3番目のブール引数です

null の値は、 nullIsLessがtrueの場合は別のStringよりも低く、nullIsLessがfalseの場合は高くなります。

試してみましょう:

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

3番目のboolean引数を持つcompareIgnoreCase()メソッドは、大文字と小文字を区別しないことを除いて、同様に機能します。

5. 結論

このクイックチュートリアルでは、文字列を比較するさまざまな方法について説明しました。

そして、いつものように、例のソースコードはGitHubにあります。