東大ニート

東大卒のニートが勉強したことをメモするブログ

<Java>文字列の比較とプリミティブ型・参照型

if文で文字列の比較を行う時に「==」を使用してしまい、想定している結果にならないということがありました。「equals」メソッドを使えばよかったのですが、忘れないように文字列の比較についてメモします。

以下の2サイトを参考にさせていただきました。

javatechnology.net

promamo.com

プリミティブ型と参照型

Javaには大きくわけて

  • プリミティブ型
  • 参照型

の2つが存在します。

プリミティブ型

プリミティブ型には以下のの8つがあり、具体的な値を格納する型が含まれます。

  • byte
  • short
  • int
  • long
  • float
  • double
  • char
  • boolean

これらは値を格納するだけなので、メソッドやフィールドは持ちません。

charとbooleanは含まれますがStringは含まれません。また、プリミティブ型は頭が小文字であることに注意。

参照型

参照型は、配列型変数クラス型変数の2種類に分けられます。

どちらも値そのものが格納されるわけではなく、参照値(配列やオブジェクトの参照先を表すアドレス)が格納されています。

参照型はプリミティブ型と異なり、メソッドやフィールドを使用できます。

クラス型変数の代表的なものとしては、String型があげられますが、プリミティブ型と少し紛らわしいものとして、ラッパークラスというものがあります。

ラッパークラスは上記の8つのプリミティブ型をオブジェクトとして操作するためのクラス型変数で、以下のように対応しています。

  • Byte(byteと対応)
  • Short(shortと対応)
  • Integer(intと対応)
  • Long(longと対応)
  • Float(floatと対応)
  • Double(doubleと対応)
  • Character(charと対応)
  • Boolean(booleanと対応)

これらのラッパークラスは参照型となります。

 

「==」と「equals」との違い

さて話を戻します。文字列の比較で「==」を使用した時に、なぜうまくいかなかったのでしょうか。

これは「==」を使用した場合、参照値と文字列とを比較してしまうためです。例えば下記の例では、strの参照値と文字列"TEST"を比較するため、比較結果は「false」となってしまいます。

public class Main {

       public static void main(String args) {

              String str = new String("TEST");

              if (str == "TEST"){

                     System.out.println("It works!");

              }

       }

}

一方、「equals」メソッドを使えば、参照先の値と文字列とを比較することができます。記述は以下のようになります。

public class Main {

       public static void main(String args) {

              String str = new String("TEST");

              if (str.equals("TEST")){

                     System.out.println("It works!");

              }

       }

}

この場合、比較結果は「true」となります。

 

今後は間違えないように気をつけよう…。