gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:31:04 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com