【问题标题】:What search algorithm is used by Java to search the String pool for already present Strings for String interning?Java 使用什么搜索算法在字符串池中搜索已经存在的字符串以进行字符串实习?
【发布时间】:2023-03-21 16:55:01
【问题描述】:

我已经阅读了以下帖子:

  1. How does the JVM check if a string is already in the string pool?

  2. How does Java implement string pooling?

他们都没有提到 JVM 使用的搜索算法来搜索之前创建并存在于所谓的“字符串池”中的字符串文字。

【问题讨论】:

  • 实现定义。哪个实现?
  • 你需要参考JVM的具体实现,有多个流行的(List of Java virtual machines)。您从 Oracles 官方网站作为标准下载获得的那个称为HotSpot
  • HotSpot JVM 中的哈希表

标签: java string algorithm jvm


【解决方案1】:

字符串池的实现是用本地语言完成的,即 c/c++ 使用 Java 本地接口 (JNI) 和共享库
You can read how to do this here
按照我的说法,字符串池已使用trie数据结构实现
You can read about tries here

Trie 将花费 O(l) ,其中 l 是请求字符串的长度,是搜索字符串池的时间。

UPD1:字符串池已实现为哈希表,并且可以使用-XX:StringTableSize=<value> 更新池的内存分配
虽然我觉得使用trie 会更好,因为trie 会在相同的空间中容纳更多数量的字符串,而不是hash-table

【讨论】:

  • 为什么你认为是Trie?看起来一些哈希表是更好的解决方案。
  • @talex HotSpot 的字符串池哈希表的缺点是它的大小是固定的,所以如果超过大小就会有很多冲突,特别是在 Java 7 之前,更新 40,当时默认大小是小至 1,023(现在约为 60,000)。但是该链接中显示的Tri 的明显缺点是它依赖于字母大小,因为char 可以有65536 个不同的值……
猜你喜欢
  • 1970-01-01
  • 2016-11-30
  • 2012-01-24
  • 1970-01-01
  • 2011-03-17
相关资源
最近更新 更多