0
0

More than 3 years have passed since last update.

【Java】参照型である文字列におけるequalsと==の違い

Posted at

参照場所の比較と値の比較

比較方法 内容
equals メモリ領域の比較
== 値の比較

プログラム例

public class MyApp {

    public static void main(String[] args) {

        String s1 = "ab"; // メモリ領域を格納
        String s2 = "ab"; // メモリ領域を格納(上と同じ領域)

        if(s1.equals(s2)) { // 内容が同じか比較
            System.out.println("same1 equals");
        }

        if(s1 == s2) { // 基本データ型の比較
            System.out.println("same2 ==");
        }
        // 文字列オブジェクトの生成(equalsメソッドを持つ)
        String ss1 = new String("ab"); // メモリ領域の格納
        String ss2 = new String("ab"); // メモリ領域の格納(上とは別の領域を作る)

        // 基本データ型の比較
        if(ss1 == ss2) { // メモリ領域の比較をしているのでfalseになるので実行されない
            System.out.println("same3 == オブジェクト");
        }
        // データの内容のの比較
        if(ss1.equals(ss2)) {
            System.out.println("same4 equals オブジェクト"); // メモリ領域は違うが値は同じなので実行される
        }
    }
}

実行例

same1 equals
same2 ==
same4 equals オブジェクト

文字列はクセがある

本来参照型である文字列には、変数には参照先のメモリ領域の場所が格納される。

そして、例ではabという同じ文字列をs1とs2に代入しているが、なんとs1にはメモリ領域の場所が入って、同じ文字列をs2に代入していると言うことで同じメモリ領域の場所が入ってしまうらしい。つまり

String s1 = "ab";
String s2 = s1;

と同じ意味?になる。

試しに実行してみると

same1 equals
same2 ==
same4 equals オブジェクト

参照場所は同じということはどちらかで参照先の値を帰るとどうなる?s1の値だけ変えても両方変わる?

String s1 = "ab";
String s2 = s1;
s2 = "cd";

にするとどうなるのか...わかりやすく

        System.out.println("s1: " + s1);
        System.out.println("s2: " + s2);

を追加して実行。

s1: ab
s2: cd
same4 equals オブジェクト

s2のみ変更され、s1には反映されていない。

そういえば、文字列は基本データ型と同じような振る舞いをするということもあり、int型と同じ挙動をするという。。。

値が同じうちは同じ参照先で、値の更新があった場合は新しいメモリ領域を作ると言うことですかね?

ややこしいですが、実行してみて改めて理解しました。

配列なら両方の値が更新されるんでしたね。復習復習!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0