gpt4 book ai didi

java - String.intern() 真的能提高性能吗?

转载 作者:太空狗 更新时间:2023-10-29 22:47:25 26 4
gpt4 key购买 nike

我做了一些调查,以了解 String.intern() 方法是如何在 java 中实现的。

我查看了 Open JDK 6 中实习生池的 C++ 实现,在那里我看到了一个简单的 HashSet。对我来说,这意味着当有人试图实习一个 String 时,接下来的步骤应该完成:

  1. 查找与给定的 String 关联的哈希码
  2. 找到合适的桶
  3. 将给定的字符串与存储桶中的所有其他字符串进行比较。在此步骤之前可能有 0 个字符串、一个字符串或很多桶中的字符串。因此,如果给定的 String 之前已经放入桶中我们将得到至少一个比较(即最好的情况。当然可能有很多碰撞和现在桶中有许多其他字符串)
  4. 如果在桶中找到了字符串,那么它应该是由 intern() 方法返回
  5. 如果未在桶中找到字符串,则应将其放入在桶中并通过 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() 方法是 native 的,因此不应每次都对其进行解释,而 String.equals() 是一个java方法。

然后我决定使用 -Xcomp 选项让 JVM 在启动时编译所有代码。

在那之后,equals 的速度比 intern 快。

我在 Java 6 和 7 上测试过它。

所以我的问题是你有没有遇到过实习提高字符串比较速度的情况?我是怎么可能?

或者 intern() 只能帮助节省更多空闲内存?

最佳答案

String.intern() 旨在减少内存 使用。

只有在内存中有很多很多相同字符串的多个副本时才使用 interned 字符串(如果有的话)。通过驻留字符串,所有这些副本将使用相同的引用。

只有当我有相同字符串的数百万个副本时,我才发现实习字符串很有用。

与任何类型的优化一样,只有在出现性能或内存问题并且您已对其进行概要分析以便检测到这是瓶颈后才执行此操作。

See this Blog post有关字符串实习的更多详细信息。

关于java - String.intern() 真的能提高性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22916843/

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