String 不变性的优点之一是哈希码缓存以加快访问速度。
- 在这种情况下,如何为具有相同哈希码的字符串处理缓存?
- 在这种情况下它真的能提高性能吗?
最佳答案
In this case how cache is handled for string which has same hashcode?
缓存的是字符串的哈希码。它缓存在字符串本身的私有(private) int
字段中。不同的字符串可能具有相同的哈希码没有任何区别......因为哈希码存储在各自的 String 对象中。
(最重要的是具有相同字符序列(因此相等
)的两个字符串具有相同的哈希码值。这是有保证的,因为 Java 字符串的哈希码算法是标准化的...并具有此属性。)
Does it really improve the performance in this case?
平均而言,是的,并且随着字符串长度的增加而增加。
一个体面的字符串哈希码算法需要查看字符串中的每个字符……否则相似的字符串最终可能会系统地映射到相同的哈希码(这很糟糕)。避免多次查看这 N 个字符是一个巨大的胜利。
缓存无济于事的唯一重要情况是:
- 当大多数字符串哈希码只使用一次时,或者
- 当大多数字符串非常短时。
(还有一个非常模糊的情况。如果 String
散列为 0
,则缓存将无效。这是因为 String
类在缓存字段中使用 0
表示哈希码尚未缓存。)
关于Java 字符串哈希码缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10576939/