java - == 与 Enum name() 和 toString()

标签 java string enums jvm string-pool

任何人都可以解释为什么 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/

相关文章:

java - 移除 Android L 上的 ActionBar 阴影(API 21)

python - 查找和替换列表中的字符串值

r - 从数据帧创建字符串

java - 如何解析特定的数据文件并对其内容进行聚类? java

Java Applet 在没有 main 方法的情况下运行?

java - 将 Google 应用引擎导出为 WAR/EAR

scala - 获取 Scala 枚举实例

Postgresql 9.1 枚举类型排序不像我预期的那样工作

java mysql - 如何快速执行许多复杂的计算?

java - 注释中的枚举