Javaで文字列を比較する
[[”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]にあります。