【Java】「なんでここequalsなの?」と聞かれた話


上司に「なんでここequalsなの?」と聞かれてなんぞなんぞって思ったことがあったので記事にしてみました。
言われたときは「文字列の比較だからだよナ…」という気持ち…

javaに触れ始めてからは(というか今この瞬間)これで合ってるのかなと思っています。
・intは「==」
・Stringは「equals」
この理解度のままで良いのか自分!!と思ったのでまとめてみます。

そもそもいつ使ってる?

初歩の初歩とは分かっていますが焦らずここから
使用頻度の高い場面はやはりif文ですかね…

        String loveAnimal = "dog";
        boolean isdogPerson = false;
        if (loveAnimal.equals("dog")) {
            isdogPerson=true;
        }
        //true
        System.out.println(isdogPerson);

どうやら筆者は犬派であるということが分かりました。
何のひねりもないif文ですが、なんだかんだ使用頻度が高いなと思います。
switchもうまく使えるようになりたい…

何を比べているの?

いざSEになったからというもの値の比較を目にすることが多いですが、少し初心に帰ってみます。
Javaにはプリミティブ型と参照型があります。
プリミティブ型について表にしてみました。

byte -128 ~ 127 の整数
short -32768 ~ 32767 の整数
int 整数
long 整数
char \u0000 ~ \uFFFF のUnicode文字列
float 実数(単精度不動小数点数)
double 実数(倍精度不動小数点数)
boolean true, false

こんなにあったなんて…
shortなんかは今回調べるまで知りませんでした…
参照型はStringが代表的で覚え方がよいかは分かりませんが、ざっくりと値を詰める箱!!と覚えています。

==っていつ使うの?

脱線しましたが、本題へ!
==演算子どうやら参照先が同じかどうかを比較するものです。
プリミティブ型(int)を比較してみます。
同じ住所の太郎さんか違う住所の太郎さんかくらいの認識で今は書き進めています。

        // プリミティブ型(int)の比較
        int intA = 1;
        int intB = 1;
        // true
        System.out.println(intA == intB);

上記の例では1と1の値同士を比較した結果がtrueになります。

次に参照型の比較をしてみます。

        // 参照型(Integer)の比較
        Integer integerC = new Integer(1);
        Integer integerD = new Integer(1);
        // false
        System.out.println(integerC == integerD);

こちらの結果はfalseになります。
どうやら値の比較を行っていないことが分かります。
参照型における==は変数が保持するインスタンス(箱)が同じであるかを比較しています。

equalsはいつ使うの?

ここで我らのequalsに迫ります。
私の必殺技はjava.util.Objects.equals
先ほどのIntegerの比較をequalsでリベンジしてみましょう。

        // 参照型(Integer)の比較
        Integer integerC = new Integer(1);
        Integer integerD = new Integer(1);
        // true
        System.out.println(integerC.equals(integerD));

equalsを使用することによってインスタンスが持っている値の比較をしていることが分かります。
私は感覚的にequalsは上記のような役割を果たしていると思っていましたが、Integer.Classの中ではこのような処理が走っているようでした。

Integer.class
        public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

中で==しているのネ…
今回書き始めようと思ったモヤモヤがかなり解消された気がしました。

せっかくなのでString型の中ものぞいてみましょう

String.class
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (!COMPACT_STRINGS || this.coder == aString.coder) {
                return StringLatin1.equals(value, aString.value);
            }
        }
        return false;
    }

こいつも==しとるやんけ…
面倒くさがらずに参照型の定義を覗いてみようと心に誓い、この辺で締めたいと思います。

まとめ

Javaにはプリミティブ型と参照型があり、それぞれの比較に==とequalsが使用されています。
・プリミティブ型は==で比較
・参照型はequalsで比較
∟中では==してる
プリなんたら型と記憶にうっすらでした。
・上司のささやかな優しさを感じました…
∟日々精進ですね

今回の内容を書きたくなったきっかけの記事様

【Java】==とequalsの違い

最近は美容師さんに勧められたDEARBOYSを読んでいます。(バスケの漫画はアチチチ)
森高麻衣ちゃん可愛すぎるな??
余談はこの辺にして、また日々の業務での疑問や理解が甘いことをピックアップしてまとめてみようと思います。