java - 什么应该是哈希表中的关键的最佳实践

标签 java algorithm data-structures hashmap hashtable

最好的查找结构是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 Charlesworth

The general rule is to use as the key whatever you need to look up with.
– Louis Wasserman

记住两个优化规则:

  1. 不要。
  2. (仅限专家)还没有。

第三条规则是:优化前分析

关于java - 什么应该是哈希表中的关键的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14367081/

相关文章:

一张表有三个标识符的SQL算法

java - 数据结构可以在不使用任何数组的情况下拥有 O(1) 访问时间吗?

java - CardLayout - 定位组件

java - 什么是可以拆分 http header 列表的最佳正则表达式?

java - Spring Security 自定义流程

javascript - 在android Webview中注入(inject)Javascript

c - 获得两个大数并通过在 C 中迭代取模值来减少它们的差异

algorithm - 极平面中的线段方向

c - 字符串的范围查询

algorithm - 使用标准遍历确定 BST 的结构等价性