【初心者向け】JavaとScalaを同時にマスターしよう!Vol. 8

こんにちは!ぐちです。

今回はコード中心に(※いつもや!!というツッコミを想像しながら)個人的に「へー、おもしろいなぁ」と思ったプチ情報をご紹介します。

前回のVol.7はこちらからどうぞ。

比較演算子

JavaでもScalaでも比較演算子ってよく使いますよね?

Javaであれば、等価比較する際に==equals()を使いますが、これちゃんと理解して使っている方ってどれぐらいいらっしゃるのでしょうか?実はけっこう奥が深いみたいですよ。Scalaであれば==eqなどですね。

しかも!ScalaとJavaでも結果が異なるということで、下記のコードをご覧ください。

Java

public class Main {
    public static void main(String[] args) {
        System.out.println(1 == 1);

        System.out.println("abc" == "abc");
        System.out.println("abc".equals("abc"));

        System.out.println("abc" == new String("abc"));
        System.out.println("abc".equals(new String("abc")));
    }
}

上記を実行すると下記の結果が出力されます。

true
true
true
false
true

Javaで注意しないといけないことは、プリミティブ型と上記でいうと文字列のリテラルの場合は値の比較ですが、参照型の場合はインスタンス自体が比較されるということですね。コードの下2つがその例です。

Scala

では、続きましてScalaを見てみましょう。

object Main {
    def main(args: Array[String]): Unit = {
        println(1 == 1)
//        println(1 eq 1) // これはエラーになる

        println("abc" == "abc") //
        println("abc" eq "abc")

        println("abc" == new String("abc"))
        println("abc" eq new String("abc"))
    }
}

これを実行すると下記のようになります。

true
true
true
true
false

この結果を見て「おもしろいな〜。」と思える人は変態です。笑

Scalaでは、==を使うと値比較を行いますが、文字列もクラスも値も全て同じです。インスタンスの比較にはeqを使います。ということで、Javaとは同じ結果にならないみたいですね。

Scala深いぞ〜!!

では今回はこの辺で。