【发布时间】:2016-04-08 17:53:46
【问题描述】:
我将股票对象保存在 HashMap 中,其中键是股票代码 String(例如,"AAPL" 代表 Apple, Inc.)。不幸的是,这是不可行的,因为 Ally Financial Inc (GM1) 和 Global Partners LP (GLP) 的哈希码相互冲突,并且会相互覆盖。例如:"GM1".hashCode() == "GLP".hashCode() == 主要问题。
股票代码字符串是否有hashCode 可以保证不发生冲突?
public Class StockTicker {
public String symbol;
public StockTicker(String symbol) { this.symbol = symbol; }
@Override
public int hashCode() {
// What goes here?
}
}
成功的答案可能会利用代码字符串不超过 5 个字符,并且是大写字母数字(“.”除外)这一事实。如“BRK.B”。
【问题讨论】:
-
如果您覆盖哈希码,请确保您也覆盖 equals。
-
可以编写一个完美的(对不相等的对象没有冲突)哈希码,但是您知道 HashMap 将正确处理冲突(尽管性能受到非常轻微的影响),即使在发生冲突时也是如此,是吗?不只使用
return symbol.hashCode();就够糟糕了吗? -
@Mshnik 你的意思是不可能吗?
-
@christopher,是的。 Equals 是微不足道的,所以想把问题集中在 hashCode 实现上。
-
请注意,除非您的收藏有 2^32 个桶,否则您的 hashCode 将减少。例如假设你只有 1024 个桶,那么 hashCode 将减少到只有 10 位,即使使用唯一的 hashCode,你也会遇到冲突。
标签: java hash hashmap hashcode