Javaで文字列の値を比較するときは、==ではなくequalsを使用します。
目次
サンプル | 文字列の値を比較する(equalsメソッド) |
文字列の値を比較する(Apacheのequalsメソッド) | |
参考 | 文字列の値を比較する(compareToメソッド) |
大文字と小文字を区別せず比較する(equalsIgnoreCaseメソッド) |
文字列の値を比較する(equalsメソッド)
public boolean equals(Object anObject) |
- 文字列の値を比較するときは、==ではなくequalsを使用します。
→値が等しくStringオブジェクトどうしであればtrueを返し、そうでない場合falseを返します。 - ==での文字列の比較は、参照先が同じかどうかの比較を行います。
→この場合、値が同じでも参照先が異なる場合はfalseになります。 - 英字の大文字と小文字を区別します。同じ値でもfalseになります。
- a.equals(b)のときでaがnullの場合は、NullPointerExceptionが発生するので注意が必要です。
→bがnullの場合はfalseを返しエラーになりません。
→対策としてはaがnullかif文で判定しnullの場合はequalsメソッドを実行しない、または後述のApacheのequalsメソッドを使用します。 - 以下はOracleのJava8のStringクラスのequalsメソッドのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#equals-java.lang.Object-
equalsメソッドのサンプルです。
package test1;
public class Test1 {
public static void main(String[] args) {
// equalsで比較。値が同じなのでtrueになる。
String a1 = "あいう";
String a2 = "あいう";
if (a1.equals(a2)) {
System.out.println("OK"); // OKが出力される
} else {
System.out.println("NG");
}
// ==で比較。値は同じだが参照先が異なっているのでfalseになる。
String e1 = new String("あいう");
String e2 = new String("あいう");
if (e1 == e2){
System.out.println("OK");
} else {
System.out.println("NG"); // NGが出力される
}
// 値が異なる場合
String b1 = "あいう";
String b2 = "かきく";
if (b1.equals(b2)) {
System.out.println("OK");
} else {
System.out.println("NG"); // NGが出力される
}
// 値は同じだがデータ型が異なる場合
String c1 = "1";
int c2 = 1;
if (c1.equals(c2)) {
System.out.println("OK");
} else {
System.out.println("NG"); // NGが出力される
}
// 英字の大文字と小文字は区別される
String d1 = "ABC";
String d2 = "ABc";
if (d1.equals(d2)) {
System.out.println("OK");
} else {
System.out.println("NG"); // NGが出力される
}
}
}
9行目は、String型のインスタンスどうしでかつ同じ値のためtrueになります。
18行目は、イコール(==)での比較です。参照先が異なるのでfalseになります。
new String("文字列")は、新たなインスタンス(場所が異なる)を生成します。
equalsメソッドで比較する値がnullまたは空文字の場合どうなる?は以下を参照下さい。 Java equalsでnullまたは空文字を比較するサンプル |
文字列の値を比較する(Apacheのequalsメソッド)
public static boolean equals(CharSequence cs1,CharSequence cs2) |
- Apache Commons LangライブラリのStringUtilsクラスのequalsメソッドを使用する方法です。
- 比較するどちらの値がnullの場合でもNullPointerExceptionが発生しません。
→Javaのequalsメソッドとの違いです。 - 英字の大文字と小文字を区別します。同じ値でもfalseになります。
StringUtilsクラスのequalsメソッドのサンプルです。
package test1;
import org.apache.commons.lang3.StringUtils;
public class Test1 {
public static void main(String[] args) {
// 値が同じ
String a1 = "あいう";
String a2 = "あいう";
if (StringUtils.equals(a1,a2)) {
System.out.println("true"); // trueが出力される
}
// 値が異なる
String a3 = "あいう";
String a4 = "かきく";
if (StringUtils.equals(a3,a4)) {
} else {
System.out.println("false"); // falseが出力される
}
// 値がnull
String str1 = null;
String str2 = "abc";
if (StringUtils.equals(str1,str2)) {
} else {
System.out.println("false"); // falseが出力される
}
// Stringのequalsメソッドの場合、実行時にNullPointerExceptionが発生
// if (str1.equals(str2)) {
// System.out.println("OK");
// }
// 英字の大文字と小文字は区別される
String b1 = "ABC";
String b2 = "ABc";
if (StringUtils.equals(b1,b2)) {
System.out.println("true");
} else {
System.out.println("false"); // falseが出力される
}
}
}
30行目は、Stringのequalsメソッドの場合で、a.equals(b)でaがnullの場合は実行時にNullPointerExceptionが発生します。
StringUtilsのライブラリの取得方法
1.StringUtilsのライブラリは、以下のApache Commons Langのダウンロードページにあります。
https://commons.apache.org/proper/commons-lang/download_lang.cgi
2.上記リンクからzipを取得して展開しjar(例:commons-lang3-3.9.jar)をビルドパスに追加してください。
jarファイルをEclipseのビルドパスに追加する方法?は以下を参照下さい。 Eclipse jarファイルをクラスパスに設定する方法 |
文字列の値を比較する(compareToメソッド)
public int compareTo(String anotherString) |
- 文字列が等しい場合は、数値の0を返します。
- Stringオブジェクトの値と引数の文字列を、辞書的(Unicode値)に比較してStringオブジェクトの値が小さい場合は、0より小さい値を返します。
- Stringオブジェクトの値と引数の文字列を、辞書的(Unicode値)に比較してStringオブジェクトの値が大きい場合は、0より大きい値を返します。
- 英字の大文字と小文字を区別します。同じ値でもfalseになります。
- 以下はOracleのJava8のStringクラスのcompareToメソッドのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#compareTo-java.lang.String-
compareToメソッドのサンプルです。
package test1;
public class Test1 {
public static void main(String[] args) {
// 値が同じ
String a1 = "あいう";
String a2 = "あいう";
if (a1.compareTo(a2)==0) {
System.out.println("OK"); // OKが出力される
} else {
System.out.println("NG");
}
// 値が異なる
String b1 = "あいう";
String b2 = "かきく";
if (b1.compareTo(b2)==0) {
System.out.println("OK");
} else {
System.out.println(b1.compareTo(b2)); // -9が出力される
}
// 値が異なる
String b3 = "かきく";
String b4 = "あいう";
if (b3.compareTo(b4)==0) {
System.out.println("OK");
} else {
System.out.println(b3.compareTo(b4)); // 9が出力される
}
}
}
8行目は、値が同じなのでcompareToメソッドは、0を戻します。
16,24行目は、値が異なるのでcompareToメソッドは、0以外を戻します。
大文字と小文字を区別せず比較する(equalsIgnoreCaseメソッド)
public boolean equalsIgnoreCase(String anotherString) |
- 文字列の値を比較します。値が等しいときはtrueを返し、異なるときはfalseを返します。
- 英字の大文字と小文字を区別しません。equalsメソッドと異なる点です。
- 以下はOracleのJava8のStringクラスのequalsIgnoreCaseメソッドのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#equalsIgnoreCase-java.lang.String-
equalsIgnoreCaseメソッドのサンプルです。
package test1;
public class Test1 {
public static void main(String[] args) {
String a1 = "ABC";
String a2 = "abc";
// equalsIgnoreCaseメソッド
System.out.println(a1.equalsIgnoreCase(a2));//true
// equalsメソッド
System.out.println(a1.equals(a2));//false
}
}
10行目は、equalsIgnoreCaseメソッドで大文字と小文字の値を比較してtrueを返しています。
13行目は、equalsメソッドで大文字と小文字の値を比較してfalseを返しています。
関連の記事
Java equalsでnullまたは空文字を比較するサンプル
Java isEmpty 空文字を確認する(StringUtils)