也许我只是疯了,或者我忘记了事情的运作方式。但我正在追逐一个bug(同时学习一些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的同一个实例。任何帮助或指导将不胜感激。
谢谢!
答案 0 :(得分:3)
当您使用字符串文字时,Java允许它们被实习,因此您获得相同的实例..
section 2.3 in the VM spec提到了这一点。
字符串文字,更一般地说,作为常量表达式值的字符串是“interned”,以便使用String.intern方法共享唯一的实例。
Groovy也遵循这条规则