==使用枚举名称()和toString()

pet*_*ter 2 java string enums jvm string-pool

任何人都可以解释为什么toString()和name()引用相同的字符串?当我使用==将它们与字符串文字进行比较时,它们都会通过!枚举名如何与JVM中的String池一起使用?

static enum User
{
   BASIC, PREMIUM;
}

System.out.println("BASIC" == User.BASIC.toString()); // true
System.out.println("BASIC" == User.BASIC.name());     // true
Run Code Online (Sandbox Code Playgroud)

Eli*_*ard 5

好吧,Enum.name()Enum.toString()返回相同的私有字段,因此引用始终是相同的.两个调用都返回name并且name == name始终是真的.

但是,为了更好地回答您的问题,JVM的内部字符串池仅存储一个不同字符串的副本.你只是请求一个不同的字符串,"BASIC"并且因为Strings是不可变的,所以它只存储一次.toString(),.name()即使这些调用返回不同的字段也可能返回相同的引用.

编辑:此外,字符串文字(源代码中的引号中的字符串)都在编译时收集,任何重复项都映射到相同的引用.因此,例如,如果您在源代码的所有地方都使用了文字"Hello I am a string literal",那么这个确切的字符串只存储一次,因为字符串是不可变的并且永远不会改变,所以在您的文字中使用该文字的每个地方源代码现在使用对它存储在JVM字符串池中的单个位置的引用.这是因为,如果可能的话,最好不要制作同一件事的一堆副本.这是一个巨大的过度简化,但你明白了.