java - 在HashMap中设置键类型,如何?

标签 java hashmap key

嗨 我想创建一个存储表达式(我创建的一个小对象)的 HashMap(java)。 如何选择要使用的 key 类型?整数和字符串对我来说有什么区别?我想我只是不完全理解 HashMap 背后的想法,所以我不确定要使用什么键。 谢谢!

最佳答案

Java HashMap 依赖于两件事:

  • hashCode() 方法,该方法返回从键生成并在映射内使用的整数
  • equals(..) 方法,该方法应与计算的哈希值一致,这意味着如果两个键具有相同的哈希码,则最好它们是相同的元素。<

具体要求,摘自Java API doc如下:

  • 每当在 Java 应用程序执行期间对同一对象多次调用 hashCode 方法时,如果对象的 equals 比较中使用的信息没有被修改,则 hashCode 方法必须始终返回相同的整数。从一个应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致。
  • 如果根据 equals(Object) 方法两个对象相等,则对这两个对象调用 hashCode 方法必须产生相同的整数结果。
  • 不要求如果两个对象根据 equals(java.lang.Object) 方法不相等,则对这两个对象中的每一个调用 hashCode 方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

如果您没有提供任何类型的具体实现,则使用对象的内存引用作为哈希码。这在大多数情况下通常都很好,但如果您有以下情况:

Expression e1 = new Expression(2,4,PLUS);
Expression e2 = new Expression(2,4,PLUS);

(我实际上不知道你需要在 HashMap 中放置什么,所以我只是猜测)

然后,由于它们是两个不同的对象,尽管具有相同的参数,因此它们将具有不同的哈希码。对于您的具体情况来说,这可能是也可能不是问题。

如果它不仅仅是使用 hasmap 而不关心这些细节,如果是的话,您将需要提供更好的方法来计算 Expression 类的哈希码和相等性。

您可以通过递归方式(通过计算子级哈希码的结果来计算哈希码)或以简单的方式(可能通过 toString() 表示形式计算哈希码)来完成此操作。

最后,如果您打算仅使用简单类型作为键(如您所说的整数或字符串),请不要担心,没有区别。在这两种情况下,两个不同的项目将具有相同的哈希码。一些例子:

assert(new String("hello").hashCode() == new String("hello").hashCode());
int x = 123;
assert(new Integer(x).hashCode() == new Integer(123).hashCode());

请注意,字符串的示例一般来说并不正确,就像我之前向您解释的那样,这只是因为字符串的 hashcode 方法根据字符串本身的内容计算值。

关于java - 在HashMap中设置键类型,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5477452/

相关文章:

java - 我如何在struts2 if标签中使用请求参数

java - "append"JTextField 的文本

java - 为什么 tomcat 没有在 window 7 的用户帐户中运行?

Java,异常处理和使用 try、finally 关闭流

java - 对ECC公钥的长度感到困惑

java - 在不使用太多内存的情况下加快搜索缓存

java集合 - map 中的keyset()与entrySet()

java - 实例化 map 列表时获取 'Type mismatch: cannot convert from ArrayList<HashMap<String,String>> to List<Map<String,String>>'

registry - 使用 auturn 编写脚本

javascript - Lodash 过滤对象中的所有值