Java プログラミング

【Java】文字列の比較!「=(イコール)」と「equals」の違いについて

おしえてあげるもん!
文字を比較したいんだけど、「==」を使っても文字が比較できないよー!
どーして?

コツコツ太郎
おしえてあげるもん

文字を比較するときは、「equals」を使うもん!

なんで「==」はダメなのー?

コツコツ太郎
おしえてあげるもん

それについて説明していくもん!

コツコツ太郎君が書いたソースはこれだ!

  String str1 = "kotsukotsutaro";
  String str2 = "kotsukotsu"+"taro";
  if (str1 == str2) {
    System.out.println("文字は一緒です");
  } else {
    System.out.println("文字は違います");//←こちらが実行される。
  }

str1もstr2も同じ文字列の「kotsukotsutaro」が入っているはずなのに、実行したら「文字は違います」となるのはなんでだろう?

コツコツ太郎

一見同じ文字列なので、「文字は一緒です」と出そうですよね?
しかし、実際は「文字は違います」と表示されてしまいます。
ここにはちょっと難しいですが、プリミティブ型か、参照型かという分類によるところなのです。

簡単に説明するとプリミティブ型の変数は、値そのものを表し、参照型の変数は値が置いてある場所を保持します。
String型は参照型の変数なので、コツコツ太郎君のソースのように「==」で比較する場合、文字列の場所を比較します。
文字列の場所はそれぞれ違うので、「文字は違います」と表示されるのです。

文字列を比較する時は「equals」を使おう!

コツコツ太郎君のソースを「equals」で書くと・・・

  String str1 = "kotsukotsutaro";
  String str2 = "kotsukotsu"+"taro";
  if (str1.equals(str2)) {
    System.out.println("文字は一緒です");//←こちらが実行される。
  } else {
    System.out.println("文字は違います");
  }

細かいところはよくわからなくても、結局文字列比較する時は「equals」使えばいいんだね!
と覚えてもらってたら大丈夫です!
しかし注意点があります。

  String str1 = null;
  String str2 = "kotsukotsutaro";
  if (str1.equals(str2)) {
    System.out.println("文字は一緒です");
  } else {
    System.out.println("文字は違います");
  }

上のプログラムを実行すると以下のようにNullPointer例外が起きてしまいます。
それはどうしてでしょう?

  Exception in thread "main" java.lang.NullPointerException

それは、Nullが入っているstr1の値を取得しようとしますが、Nullなので値が取得できず例外が発生してしまうのです。
なのでこういう場合は、定数を「equals」の前に書いてください。
こうすることで例外は起きません。

  String str1 = null;
  String str2 = "kotsukotsutaro";
  if (str2.equals(str1)) { //nullとならない値を「equals」の前に書く
    System.out.println("文字は一緒です");
  } else {
    System.out.println("文字は違います");//←こちらが実行される。
  }

Objects.equals()

また、Objects.equals()を使う方法もあります!
これは比較する文字列のどっちかがNullでもNullPointer例外は出ないので、こちらを使うことをオススメします!
import java.util.Objects;をインポートして使ってください、

  String str1 = "kotsukotsutaro";
  String str2 = "kotsukotsu"+"taro";
  if (Objects.equals(str1, str2)) {
    System.out.println("文字は一緒です");//←こちらが実行される。
  } else {
    System.out.println("文字は違います");
  }

-Java, プログラミング

© 2025 みんもん -みんなの問題- Powered by AFFINGER5