如果你有一个字符串的两个实例,并且它们是相等的,那么在Java中它们将共享相同的内存。这是如何在幕后实现的?
编辑:我的应用程序使用了大量的String对象,其中许多是相同的。为了避免创建自定义的flyweight实现,使用Java字符串常量池的最好方法是什么?
发布于 2010-05-27 04:13:46
看看java.lang.String
的源代码(整个java api的源代码是JDK的一部分)。
总结一下:一个字符串包装了一个char[]
的子序列。支持char[]
永远不会被修改。这不是通过在String
类外部泄漏或捕获此char[]
来实现的。但是,多个Strings
可以共享相同的char[]
(请参阅String.substring
的实现)。
正如在其他答案中解释的那样,还有一种内部机制。
发布于 2010-05-26 10:59:25
字符串文字在Java中是内嵌的,所以实际上只有一个String对象有多个引用(当它们相等时,并不总是这样)。有关更多详细信息,请参阅java.net文章All about intern()。
在JLS的3.10.5 String Literals一节中也有一个很好的例子/解释,它讨论了字符串何时被实例化以及它们何时将是不同的。
https://stackoverflow.com/questions/2909848
复制相似问题