最好的查找结构是HashTable
。它平均提供恒定的访问(在最坏的情况下是线性的)。
这取决于散列函数。好的。
我的问题如下。假设 HashTable
的良好实现,例如HashMap
是否有关于映射中传递的键的最佳实践?我的意思是建议键必须是不可变对象(immutable对象),但我想知道是否还有其他建议。
例如 key 的大小?例如,在一个好的 HashMap 中(以上述方式)如果我们使用 String
作为键,“瓶颈”是否会出现在 equals
的字符串比较中(尝试找到 key )?那么键应该保持小吗?或者是否有不应该用作键的对象?例如。 URL
?在这种情况下,您如何选择使用什么作为 key ?
最佳答案
HashMap 的最佳性能键可能是 Integer,其中 hashCode()
和 equals()
实现为:
public int hashCode() {
return value;
}
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
也就是说,HashMap 的目的是将一些对象(值)映射到其他一些对象(键)。哈希函数用于寻址(值)对象的事实是提供快速、恒定时间的访问。
it is recommended that the key must be an immutable object but I was wondering if there are other recommendations.
建议是Map objects to what you need:不要认为什么更快;但请考虑什么最适合您的业务逻辑来处理要检索的对象。
重要的要求是键对象必须是不可变的,因为如果在将键对象存储在 Map 中后更改键对象,以后可能无法检索关联的值。
HashMap
中的关键字 是Map
。您的对象应该只是映射。如果您牺牲了优化键的映射任务,那么您就违背了 Map 的目的 - 可能不会实现任何性能提升。
我 100% 同意您问题中的前两条评论:
the major constraint is that it has to be the thing that you want to base the lookup on ;)
– Oli CharlesworthThe general rule is to use as the key whatever you need to look up with.
– Louis Wasserman
记住两个优化规则:
- 不要。
- (仅限专家)还没有。
第三条规则是:优化前分析。
关于java - 什么应该是哈希表中的关键的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14367081/