[[”overview”]]


1概要

この記事では、Javaで

Strings

を比較するさまざまな方法について説明します。


String

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

[[”string-comparison”]]


2

String

クラスとの比較

String


[[”comparison-op”]]


2.1.

“ ==”

比較演算子

を使用する

テキスト値を比較するために“ ==”演算子を使用することは、Java初心者が最もよくある間違いの1つです。



“ ==”

は2つの

Strings




__の参照等価性のみをチェックするため、これは正しくありません。

__それらが同じオブジェクトを参照するかどうかを意味します。

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

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

はリテラルで作成され、

string3



new

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

[[”equals-string”]]


2.2.

equals()


を使う


String

クラスは、

Objectから継承された

equals()

をオーバーライドします。** このメソッドは、2つの

Strings__を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.

を返します。

[[”equalsignorecase-string”]]


2.3.

equalsIgnoreCase()を使う



equalsIgnoreCase()

メソッドはブール値を返します。名前が示すように、このメソッドは

Strings



____を比較しながら、文字の大文字と小文字の区別を無視します。

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

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

[[”compareto-string”]]


2.4.

compareTo()


を使用する


compareTo()

メソッドは

int

type値を返し、辞書または自然順序付けに基づいて2つの

Strings

文字を辞書式に** 比較します。

このメソッドは、2つの

Strings

が等しい場合、または両方が

nullの場合は0を返し、


の最初の

String

が引数の前にある場合は負の数、

String.の後にある場合は0より大きい数値を返します。

例を見てみましょう。

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

[[”comparetoignorecase-string”]]


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

[[”comparison-objects”]]


3

String


Objects

クラスとの比較


Objects

は、このシナリオで役に立つ2つの

Stringsを比較するための、静的な

equals()__メソッドを含むユーティリティクラスです。

2つの

Strings



first


でそれらのアドレスを使用してそれらを比較した場合、メソッドは

true

を返します

、つまり“

==”

。したがって、両方の引数が

null

の場合は

true

が返され、一方の引数が

null

の場合はfalseが返されます。

それ以外の場合は、渡された引数の型のクラスの

equals()

メソッドを呼び出します。これは、ここでは

String’

class

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

[[”comparison-apache”]]


4

String


Apache Commonsとの比較


  • Apache Commonsライブラリには、

    __String –


    関連操作用の

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


StringUtils



equalsIgnoreCase()

メソッドは、

boolean

値を返します。これは、

Strings内の文字の大文字小文字の区別を無視することを除いて、

equals()と同様に機能します。

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


4.2.

equalsAny()

および



equalsAnyIgnoreCase()


を使用する


equalsAny()

メソッドの最初の引数は

String

で、2番目の引数は複数引数型の

CharSequenceです。他の指定された

Strings

が最初の

String

の大文字と小文字を区別して一致する場合、このメソッドは

true__を返します。

そうでなければ、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()


の使用


StringUtils

クラスの

compare()メソッドは、

String

クラスの

compareTo()


メソッドの

nullセーフバージョンであり、

non

null値よりも小さい

null

値を考慮して

null

値を処理します。** 2つの

null__値は等しいと見なされます。

さらに、このメソッドは

Strings

のリストを

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

オプションと一緒に使用することもできます。これは、null値を少なくするかどうかを決定する3番目の

boolean

引数です。


nullIsLess

がtrueの場合、

null

値は別の

String

より小さくなり、

nullIsLess

がfalseの場合、高くなります。

試してみましょう。

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

3番目の

boolean

引数を持つ

compareIgnoreCase()

メソッドは、大文字小文字を区別しないこと以外は同様に機能します。

[[”conclusion”]]


5結論

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

そしていつものように、例のソースコードはhttps://github.com/eugenp/tutorials/tree/master/java-strings[over on GitHub]にあります。