字符串池管理

Posted

技术标签:

【中文标题】字符串池管理【英文标题】:String Pool management 【发布时间】:2016-03-08 02:25:28 【问题描述】:

Strings 是不可变对象,存储在字符串池中。假设在应用程序中没有使用new 运算符创建任何字符串。在这种情况下,是否有必要使用equals 方法而不是== 进行String 对象相等性检查? 我觉得上述问题的答案可能是肯定的,它与字符串池大小有关。 字符串池是如何管理的?内存是有限的,所以我觉得字符串池也有一定的大小。它是否像LRU 缓存一样工作,当池已满时丢弃最少使用的字符串?

请提供您宝贵的意见。

我的问题不是关于字符串池的大小。我的问题是,如果没有使用 new 运算符创建任何字符串,那么使用 == 将始终是安全的。此语句是否正确,或者在这种情况下,两个具有相同字符串字符的字符串引用也可能返回 false。我知道在设计方面我应该始终使用 equals 方法,但我只想知道语言规范。

【问题讨论】:

我认为无论字符串是否创建通常new,都应该使用equals() What if Size of String Pool Exceeds?的可能重复 我和@TimBiegeleisen 在一起。当然,在某些情况下您可以使用==,但我认为它只是说“看看我有多聪明。我打败了系统”。然后有一天它停止工作,你看起来不再那么聪明了。即使它继续工作。审查您的代码的每个人都会拿起它,您必须解释 - 直到您厌倦它并在您的代码中评论每个 stringOne == stringTwo 来解释它是有效的,因为您太聪明了。只需按照正常方式进行即可,避免所有问题! 【参考方案1】:

字符串是不可变的对象,存储在字符串池中。假设在应用程序中没有使用 new 运算符创建任何字符串。在这种情况下,是否有必要使用 equals 方法而不是 == 来进行 String 对象的相等性检查?

如果你总是使用equals(),你永远不必担心这个问题的答案,但除非你只打算比较字符串文字,否则这种情况永远不会出现。

我觉得上述问题的答案可能是肯定的

正确。

它与字符串池大小有关。

没有。

字符串池是如何管理的?内存是有限的,所以我觉得字符串池也有一定的大小。

没有。

它是否像 LRU 缓存一样工作,当池已满时丢弃最少使用的字符串?

不可以,但是可以从池中垃圾收集已被 intern()-ed 的字符串。

【讨论】:

@EJB 感谢您的回答。我已经编辑了我的问题,我知道对象 equals 应该用作 == 比较对象是否相同并且不检查内容。我想要一些有关语言规范的参考..

以上是关于字符串池管理的主要内容,如果未能解决你的问题,请参考以下文章

java缓冲池

C#中字符串的内存分配与驻留池

每日积累 8.6

.NET各种池:字符串拘留池线程池 应用程序池数据库连接池

String的内存和intern()方法

DB2的JDBC连接字符串有数据库字符集编码的配置参数吗