当前位置: 首页 > 知识库问答 >
问题:

执行字符串。intern()真的提高了性能吗?

卜泓
2023-03-14

我做了一些调查,以了解字符串是如何工作的。intern()方法是用java实现的。

我在Open JDK 6中查看了Intern pool的C实现,在那里我看到了一个简单的哈希集。对我来说,这意味着当有人试图实习一个字符串时,接下来的步骤应该完成:

  1. 查找与给定字符串关联的哈希代码

很多人都这么说str1。intern()=str2。intern()将比str1快。等于(str2)。

但我不明白为什么它应该更快。

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

str1.intern () == str2.intern()的情况下,我们必须获得多少比较或将字符串放入/从池中(对,它可以是很多比较,它们是简单的逐个字符的比较)?

因此,在str1.intern () == str2.intern()的情况下,即使我们使用==来比较字符串,我们也会有许多额外的操作,例如前面描述的比较。

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

第一个结果告诉我,str1.intern () == str2.intern()str1.equals(str2)快。

这种行为是由字符串引起的。intern()方法是本机方法,因此不应该每次都解释它,也不应该解释字符串。equals()是一个java方法。

所以我决定使用-Xcomp选项让JVM在开始时编译所有代码。

之后,equals展示了比实习生更好的速度。

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

所以我的问题是,你有没有见过实习提高字符串比较速度的情况?是的,怎么会这样?

或者,也许只能帮助节省更多的可用内存?

共有2个答案

申屠锦
2023-03-14

对于您关于为什么str1.intern () == str2.intern()可能更快的问题:

这是字符串。equals()实现—正如您所看到的,根据比较的字符串,它可能效率很低。

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String) anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                        return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

您的步骤可能要快得多:
1)hashCode()对任何String计算一次,因为它的不变性并且相当快
2)找到桶是O(1)
3)将您的String与同一桶中的其他字符串进行比较-可能有几个,但仍然应该比equals()
4)和5)快

并且不要忘记,对于任何String,上述操作只需执行一次,一旦intern()ed,则从第一次比较返回结果。

南宫泓
2023-03-14

<代码>字符串。intern()旨在减少内存使用。

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

我只看到当我有数百万个相同字符串的副本时,插入字符串才有帮助。

与任何类型的优化一样,只有在出现性能或内存问题并对其进行了分析,以便检测到这是瓶颈之后,才可以进行优化。

有关字符串实习的更多详细信息,请参阅此博客文章。

 类似资料:
  • 问题内容: 从String类的javaDocs的intern方法中: 调用intern方法时,如果池已经包含等于equals(Object)方法确定的此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。 考虑以下用例: 有人可以解释为什么 是 正确的, 而以下是 错误的 : 问题答案: 七是您第一次使用字符串’hello2’。因此

  • 问题内容: 尽管在Java中使用’final’关键字有很多原因,但我不断反复听到的一个原因是它使您的代码更安全。尽管在这种琐碎的情况下这似乎很有意义: 使用final关键字,您希望没有恶意代码能够更改变量passwordHash。但是,使用反射可以更改passwordHash字段上的最终修饰符。 那么“最终”是否提供任何真正的安全性,还是仅仅是安慰剂? 编辑: 有一些非常有趣的讨论,我希望我可以接

  • 本文向大家介绍浅析Python中字符串的intern机制,包括了浅析Python中字符串的intern机制的使用技巧和注意事项,需要的朋友参考一下 intern机制:   字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?即

  • 问题内容: 在Java和C#之类的语言中,字符串是不可变的,并且一次建立一个字符的字符串在计算上是昂贵的。在上述语言中,有一些库类可以降低这种成本,例如C#和Java 。 php(4或5;我对两者都感兴趣)是否都共享此限制?如果是这样,是否有类似的解决方案? 问题答案: 不,在PHP中没有stringbuilder类的类型,因为字符串是可变的。 话虽如此,根据您在做什么,有不同的方式来构建字符串。

  • 我正在用docx4j做一些测试。我需要做的是将复杂的Word文档(2-3页的文本、表格、项目符号列表、图像)转换成XHTML。

  • 我在我的应用程序中创建了第二个DataSource。 我用HikariDataSource创建了它,因为它断开了连接,所以出现了问题。 现在它没有断开,但是很慢 我的配置如下: 爪哇: 有人能告诉我如何提高绩效吗。 它们是表的小查询,分页约为25条记录,需要4秒钟。 我观察到,查询一个select的200条记录需要46秒,而查询只需要2秒。 以前,它们是千分之一秒。 非常感谢。