5

文字列は不変ですが、値の同等性と参照の同等性は、Scalaのjava.lang.Stringオブジェクトでは同じではないと予想されます。これは、2つの文字列保持valが、それらの文字列が同一であっても、参照が等しくないようにする必要があることを意味します。しかし、2.9.1.finalREPLで得られるものは次のとおりです。

scala> val s1 = "a"; val s2 = "a"
s1: java.lang.String = a
s2: java.lang.String = a

scala> s1 eq s2
res0: Boolean = true

結果がなかった理由はfalse何ですか?List("a")代わりに同じ実験を行うと"a"、期待どおりに機能します。このeqメソッドは、AnyRefでfinalとしてマークされています。またはのために特別に行われたコンパイラの魔法はありますStringjava.lang.String

4

2 に答える 2

13

はい、それはコンパイラの魔法です。具体的には、インターンと呼ばれます。Javaも同様に機能します。これは、メモリ使用量やすべての文字を比較せずに比較できるなど、効率上の理由によるものです。これがウィキペディアの記事です。このメソッドを使用して、文字列を手動でインターンすることもできますintern()

于 2012-04-09T10:56:12.420 に答える
4

Java言語仕様から:

文字列リテラルは、クラスのインスタンスへの参照ですString(§4.3.1、§4.3.3)。

さらに、文字列リテラルは常にクラスの同じインスタンスを参照しますString。これは、文字列リテラル(またはより一般的には定数式(§15.28)の値である文字列)が、メソッドを使用して一意のインスタンスを共有するように「インターン」されるためString.internです。

于 2012-04-09T11:08:25.003 に答える