任何人都可以解释为什么 toString() 和 name() 引用相同的字符串吗?当我使用 == 将它们与字符串文字进行比较时,它们都通过了!枚举名称如何与 JVM 中的字符串池一起使用?
static enum User
{
BASIC, PREMIUM;
}
System.out.println("BASIC" == User.BASIC.toString()); // true
System.out.println("BASIC" == User.BASIC.name()); // true
最佳答案
嗯,Enum.name()
和 Enum.toString()
返回相同的私有(private)字段,因此引用始终是相同的。两个调用都返回 name
并且 name == name
始终为 true。
但是,为了更好地回答您的问题,JVM 的内部字符串池仅存储不同字符串的一份副本。您只请求一个不同的字符串,"BASIC"
,并且由于 String
是不可变的,因此它只存储一次,因此 .toString()
和 .name()
可能会返回相同的引用,即使这些调用返回不同的字段。
编辑:
此外,字符串文字(源代码中引号中的字符串)都是在编译时收集的,并且所有重复项都映射到相同的引用。因此,例如,如果您在源代码中到处都在使用文字“Hello I am a stringliteral”
,那么该确切的字符串仅存储一次,并且因为字符串是不可变的并且永远不会改变,源代码中使用该文字的每个地方现在都使用对其存储在 JVM 字符串池中的单个位置的引用。这是因为,如果可能的话,显然最好不要复制同一件事的一堆副本。这过于简单化了,但你明白了。
关于java - == 与 Enum name() 和 toString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36343081/