5

字符串不变性的优点之一是哈希码缓存以加快访问速度。

  • 在这种情况下,如何为具有相同哈希码的字符串处理缓存?
  • 在这种情况下,它真的能提高性能吗?
4

5 回答 5

8

在这种情况下,如何为具有相同哈希码的字符串处理缓存?

缓存的是字符串的哈希码。它缓存在int字符串本身的私有字段中。不同的字符串可能具有相同的哈希码没有任何区别......因为哈希码存储在各自的字符串对象中。

(最重要的是具有相同字符序列(因此是equal)的两个字符串具有相同的哈希码值。这是可以保证的,因为 Java 字符串的哈希码算法是标准化的......并且具有此属性。)

在这种情况下,它真的能提高性能吗?

平均而言,是的,并且随着字符串长度变大而更多。

一个像样的字符串哈希码算法需要查看字符串中的每个字符......否则相似的字符串最终可能会系统地映射到相同的哈希码(这很糟糕)。避免多次查看这 N 个字符是一个巨大的胜利。

缓存无济于事的唯一重要情况是:

  • 当大多数字符串哈希码只使用一次时,或者
  • 当大多数字符串都很短时。

(还有一个非常模糊的情况。如果String哈希到0,那么缓存将无效。这是因为String该类0在缓存字段中使用表示哈希码尚未缓存。)

于 2012-05-14T02:56:25.713 回答
4

在这种情况下,如何为具有相同哈希码的字符串处理缓存?

我不明白你问题的第一部分。缓存对所有字符串的处理都是相同的,无论哈希码是否相同(因为理论上两个不同的字符串可以具有相同的哈希码,因此如果哈希码相等,并不意味着字符串相等)。但如果使用相同的 String对象,hashCode 不必重新计算,因为它已被缓存。

它真的能提高性能吗?

绝对是的

于 2012-05-14T02:39:15.523 回答
2

缓存只是 String 对象中的一个 int 字段。多个字符串可以毫无问题地具有相同的哈希码。

它显着提高了性能,因为:

  • 计算哈希码比读取单个 int 字段要昂贵得多
  • 如果你计算一个字符串的哈希码一次,很可能你会想要多次计算字符串的哈希码(例如它被用在一个哈希映射键中)

有兴趣的可以看看源码:

http://www.docjar.com/html/api/java/lang/String.java.html

于 2012-05-14T02:48:33.147 回答
1

在大多数情况下,在您尝试将字符串放入 HashMap 之前,不会计算 hashCode。然后地图将其缓存在 Map.Entry 中,以加快比较和重新散列。

于 2016-02-10T22:02:26.413 回答
-1

对于第一个,这取决于您的哈希策略。例如,如果将一个单词的所有字母的 ascii 代码加在一起作为该字母的哈希码(a 为 65,A 为 97),在这种情况下,单词“abc”和“bca”具有相同的哈希码。

对于第二个,它也取决于您的哈希策略,但在大多数情况下,答案是肯定的。

于 2012-05-14T02:44:11.893 回答