我进行了一些调查,以了解如何在Java中实现String.intern()方法。

我从Open JDK 6看了Intern pool的C++实现,在那里看到了一个简单的HashSet。对我来说,这意味着当有人尝试实习String时,应完成以下步骤:

  • 查找与给定String关联的哈希码
  • 找到合适的存储桶
  • 将给定的字符串与存储桶中的所有其他字符串进行比较。
    在此步骤之前,可能有0个字符串,一个字符串或很多
    桶中的弦。所以如果给定的字符串以前
    放入存储桶中,我们将至少获得一个比较(即
    最好的情况。当然可能发生了很多碰撞,
    现在还有许多其他字符串在存储桶中)
  • 如果在存储桶中找到了字符串,则应为intern()方法
  • 返回
  • 如果未在存储桶中找到字符串,则应将其放入
    在存储桶中,并通过intern()方法
  • 返回

    许多人说str1.intern() == str2.intern()会比str1.equals(str2)快。

    但是我看不出它应该更快的原因。

    如我所见,在str1.equals(str2)的情况下,我们总是有两个字符串在String.equals()方法中逐个字符地比较char。

    str1.intern() == str2.intern()的情况下,我们将必须进行多少次比较或将String放置到池中或从池中放入String(对,这可能是很多比较,并且它们也很简单,逐字符比较)?

    因此,即使使用str1.intern() == str2.intern(),即使我们使用==比较字符串,我们也将有许多其他操作,例如前面所述的比较。

    当我理解它之后,我决定进行一些基准测试。

    最初的结果使我知道str1.intern() == str2.intern()str1.equals(str2)快。

    此行为是由于String.intern()方法是 native 的这一事实引起的,因此不应每次都对其进行解释,并且String.equals()是Java方法。

    因此,我决定使用-Xcomp选项使JVM在启动时编译所有代码。

    在那之后,她的表现要比实习生更快。

    我在Java 6和7上进行了测试。

    所以我的问题是,您有没有见过Intern增加String比较速度的情况?我是怎么回事?

    还是intern()只能帮助节省更多的可用内存?

    最佳答案

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

    仅当内存中有许多多个SAME字符串副本时,才使用插入字符串(如果有的话)。通过内联字符串,所有这些副本将使用相同的引用。

    我只有在拥有数百万个相同字符串的副本时,才可以实习字符串。

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

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

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

    10-13 05:54