【发布时间】:2014-05-19 22:58:27
【问题描述】:
我做了一些调查以了解String.intern() 方法是如何在java 中实现的。
我查看了 Open JDK 6 中实习生池的 C++ 实现,在那里我看到了一个简单的HashSet。对我来说,这意味着当有人试图实习 String 时,应该完成以下步骤:
- 查找与给定
String关联的哈希码 - 找到合适的存储桶
- 将给定的字符串与存储桶中的所有其他字符串进行比较。 在此步骤之前可能有 0 个字符串、一个字符串或很多 桶中的字符串。因此,如果给定的 String 以前是 放入桶中,我们将得到至少一个比较(即 最好的情况。当然可能有很多碰撞和 现在还有许多其他字符串在桶中)
- 如果在存储桶中找到了字符串,那么它应该是
由
intern()方法返回 - 如果未在桶中找到字符串,则应将其放入
在桶中并由
intern()方法返回
很多人说str1.intern() == str2.intern() 会比str1.equals(str2) 快。
但我看不出它应该更快的原因。
正如我所见,在str1.equals(str2) 的情况下,我们总是有两个字符串在String.equals() 方法中逐个字符地进行比较。
在str1.intern() == str2.intern() 的情况下,我们需要进行多少次比较或将字符串放入/取出池(对,可能有很多比较,而且它们也是简单的逐字符比较)?
所以在str1.intern() == str2.intern() 的情况下,即使我们使用== 来比较字符串,我们也会有许多额外的操作,例如前面描述的比较。
当我理解它时,我决定进行一些基准测试。
第一个结果告诉我str1.intern() == str2.intern() 比str1.equals(str2) 快。
这种行为是由于String.intern() 方法是本机的,因此不应每次都对其进行解释,而String.equals() 是一个java 方法。
于是我决定使用-Xcomp 选项让JVM 在启动时编译所有代码。
在那之后等于展示了比实习生更好的速度。
我在 Java 6 和 7 上对其进行了测试。
所以我的问题是你有没有遇到过提高字符串比较速度的情况?我是的,怎么可能?
或者intern()可能只能帮助节省更多的空闲内存?
【问题讨论】:
-
str1.intern() == str2.intern()- 不!你应该已经把字符串实习了。在比较站点实习是纯粹的开销。 (当你正确使用它时,实习是否有用还有待商榷,但这样的实习是没有用的。) -
我不认为这完全回答了这个问题,我也没有手边的参考资料,但我记得很久以前读过
String.hashCode方法已针对非常好的分布进行了优化,例如在哈希表中,您将很少遇到冲突。 -
“人们说”绝不是做任何事的好理由。 +1 进行自己的研究。
-
+1 用于实际测试以回答“X 比 Y 快”的问题。
-
+1 很好的研究,一个有趣的问题!
标签: java string string-interning