哈希映射的字符串键在哪个长度上被认为是不好的做法?

2022-09-02 01:10:08

我一直试图关注良好的性能和干净的代码。

我很难掌握拥有一个包含150个字符的键的HashMap是否合理。

  • HashMap键的长度是否有不成文的法律?
  • 使用 150 个字符的字符串键是否被视为不好的做法?
  • 它会影响性能吗?在哪个长度?

答案 1

不是真的,150个字符字符串对于计算一个相对简单。hashCode

话虽如此,在这种情况下,我建议您进行测试!

创建一个例程,该例程填充 HashMap,例如,在此处插入一个大小,该大小代表您的使用方案随机值,并使用 5 个字符的字符串作为键。测量所需时间。然后对 15 个字符的键执行相同的操作,并查看其缩放方式。

此外,Java 中的字符串是不可变的,这意味着可以针对存储在字符串常量池中的每个字符串缓存该字符串,并且当您对同一 String 对象调用 hashCode 时,不需要重新计算。hashCode

这意味着,尽管您在创建地图时计算的是较大的哈希代码,但在访问时,其中许多哈希代码已经预先计算和缓存,从而使原始 String 的大小更加不相关。


答案 2

HashMap键的长度是否有不成文的法律?

如果有,它也是不言而喻的。我会在分析器中测量您的用例,只担心您可以作为问题进行测量的事情,而不是您可以想象中可能成为问题的事情。

使用 150 个字符的字符串键是否被视为不好的做法?

我怀疑。

它会影响性能吗?在哪个长度?

一切都会影响性能,通常很小,有时甚至会衡量。问题应该是;你需要150个字符的键。如果这样做,请使用它们。


有一种奇特的情况,其中hashCode()为零的字符串是一个坏主意。这是因为在Java 1.0到6中,它没有优化哈希码为零的用例,并且可以预测拒绝服务攻击。Java 7 通过使用次要的、不太可预测的哈希码来解决这个问题。

为什么 String 的 hashCode() 不缓存 0?


推荐