gpt4 book ai didi

java - Java 中的字符串池的行为是否类似于 LRU 缓存?

转载 作者:行者123 更新时间:2023-12-01 21:37:10 25 4
gpt4 key购买 nike

字符串是不可变的,并在字符串池中进行管理。我想知道这个池是如何管理的。如果应用程序中使用了大量的字符串文字(我理解当追加、替换操作等修改较多时应该使用字符串构建器),那么 Pool 不会一次又一次地重新创建新的字符串对象,从而增强应用程序的性能但是使用池中存在的相同对象,这是可能的,因为字符串是不可变的,并且这样做不会产生不良影响。

我的问题是如何管理这个字符串池。如果万一某些“k”字符串出现频率很高,并且可能很少有其他字符串对象一旦创建就不再使用。可能还使用其他较新的字符串文字。

在这种情况下,字符串池的行为就像 LRU 缓存一样,保留对最新使用的文字的引用并删除旧的不使用了池中的字符串吗?

字符串池有大小吗?我们可以在应用程序中控制它吗?

编辑:

通常我们会为我们实现的自定义对象池指定大小。我想知道为什么 Sting Pools 没有像 LRU 这样的功能。这可能是一个特点。如果是大字符串,也不会有问题。但我觉得它的实现方式是这样的,但我只是想知道为什么它不存在,我的意思是它不存在是出于某种正当的原因,拥有此功能会导致一些不良影响。如果有人能够阐明这些不良影响,那就太好了。

最佳答案

字符串池不是 LRU 缓存,因为除非 GC,否则不会取出条目。

有两种方法可以获取字符串池中的条目。字符串文字会自动到达那里,并且可以使用 String.intern() 添加新条目,除非 String 已存在于池中,在这种情况下,将返回对其的引用.

如果不再有对这些值的引用,这些值将被垃圾回收,这对于字符串文字(例如字符串常量)来说可能比 intern() 的垃圾收集要困难一些编辑。

Java 6 和 Java 8(甚至次要版本之间)的实现发生了很大变化。字符串池的默认大小显然是1009,但可以使用-XX:StringTableSize=N(自Java 7)参数更改。此大小是内部哈希表的表大小,因此如果您使用大量 intern() (对于字符串文字,应该足够了),则可以将其调高。大小仅影响 intern() 调用的速度,而不影响您可以实习的字符串数量。

基本上,除非您大量使用 intern()(大概是出于充分的理由),否则几乎没有理由担心字符串池。特别是因为它不再存储在 PermGen 中,因此它不再容易导致 OutOfMemoryErrors

Source .

关于java - Java 中的字符串池的行为是否类似于 LRU 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36835850/

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