2

たぶん私はただ頭がおかしいのかもしれないし、あるいは物事がどのように機能するのかを忘れているのかもしれない。しかし、私は(Groovyを学びながら)バグを追いかけていましたが、次のアサーションが失敗することがわかりました。文字列リテラルを使用すると、Stringの新しいインスタンスが作成されると思いました。私が間違っている?

String one = 'one'
String two = 'one'

// I thought this should fail, but it doesn't
assert one.is(two) == false

one = new String("one")
two = new String("one")

// This works as expected
assert one.is(two) == false

dump()メソッドを使用すると、それらが実際にStringの同じインスタンスであることがわかります。任意のヘルプやガイダンスをいただければ幸いです。

ありがとう!

4

1 に答える 1

3

文字列リテラルを使用する場合、Java ではそれらをインターンできるため、同じインスタンスを取得できます。

VM 仕様のセクション 2.3 でこれについて言及されています。

文字列リテラル、およびより一般的には定数式の値である文字列は、メソッド String.intern を使用して一意のインスタンスを共有するために「インターン」されます。

Groovyもこのルールに従います

于 2012-08-17T13:18:14.020 に答える