我做了一些调查,以了解字符串是如何工作的。intern()方法是用java实现的。
我在Open JDK 6中查看了Intern pool的C实现,在那里我看到了一个简单的哈希集。对我来说,这意味着当有人试图实习一个字符串时,接下来的步骤应该完成:
很多人都这么说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上测试了它。
所以我的问题是,你有没有见过实习提高字符串比较速度的情况?是的,怎么会这样?
或者,也许只能帮助节省更多的可用内存?
对于您关于为什么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,则从第一次比较返回结果。
<代码>字符串。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秒。 以前,它们是千分之一秒。 非常感谢。