对于JVM的字符串池,在Java中创建String的时间成本是多少?

new*_*gic 1 java string jvm

Java有一个字符串池,因此在实际创建一个新字符串之前,我猜有一个检查是否已存在相同的字符串,这次调用的成本是多少?

池是基于散列或树的结构吗?

在任何一种情况下,我猜测归结为String哈希码的性能,因为搜索树使用哈希码作为密钥?

我猜它是关于log n,其中n是当前堆上的字符串数.

Sum*_*ngh 7

来自这个非官方的博客

Java虚拟机维护内部字符串(唯一字符串池)的内部引用列表,以避免堆内存中重复的String对象.只要JVM从类文件加载String文本并执行,它就会检查该String是否存在于内部列表中.如果它已存在于列表中,则它不会创建新的String,而是使用对现有String对象的引用.

JVM在内部对String literal进行此类检查,但不对通过'new'关键字创建的String对象进行检查.您可以显式强制JVM对通过' new'keyword using String.intern()method 创建的String对象执行此类检查.这会强制JVM检查内部列表,并使用现有的String对象(如果已存在).