Java 如何在HashMap中设置键类型?
嗨 我想创建一个存储表达式的HashMap(java),这是我创建的一个小对象。 如何选择要使用的钥匙类型?整数和字符串对我来说有什么区别?我想我只是不完全理解HashMap背后的想法,所以我不确定使用什么键。Java 如何在HashMap中设置键类型?,java,hashmap,key,Java,Hashmap,Key,嗨 我想创建一个存储表达式的HashMap(java),这是我创建的一个小对象。 如何选择要使用的钥匙类型?整数和字符串对我来说有什么区别?我想我只是不完全理解HashMap背后的想法,所以我不确定使用什么键。 谢谢 键及其关联值都是对象。当您从HashMap中获取某些内容时,必须将其转换为它所表示的对象的实际类型(我们可以这样做,因为Java中的所有对象都继承对象类)。因此,如果键是字符串,值是整数,则可以执行以下操作: Integer myValue=(Integer)myMap.get(“
谢谢 键及其关联值都是对象。当您从HashMap中获取某些内容时,必须将其转换为它所表示的对象的实际类型(我们可以这样做,因为Java中的所有对象都继承对象类)。因此,如果键是字符串,值是整数,则可以执行以下操作:
Integer myValue=(Integer)myMap.get(“myKey”)代码>
但是,您可以使用Java泛型告诉编译器您将只使用字符串和整数:
HashMap myMap=newhashmap()代码>
有关HashMap的更多详细信息,请参阅。键及其关联值都是对象。当您从HashMap中获取某些内容时,必须将其转换为它所表示的对象的实际类型(我们可以这样做,因为Java中的所有对象都继承对象类)。因此,如果键是字符串,值是整数,则可以执行以下操作:
Integer myValue=(Integer)myMap.get(“myKey”)代码>
但是,您可以使用Java泛型告诉编译器您将只使用字符串和整数:
HashMap myMap=newhashmap()代码>
有关HashMap的更多详细信息,请参阅。JavaHashMap
依赖于两个方面:
hashCode()
方法,返回从键生成并在映射内使用的整数
等于(…)
方法,该方法应与计算的哈希一致,这意味着如果两个键具有相同的哈希代码,则它们必须是相同的元素
具体要求如下所示:
- 在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而不关心这些细节,那么您需要提供更好的方法来计算hashcode和表达式
类的相等性
您可以通过递归的方式(通过计算子项的hashcodes的结果来计算hashcode)或简单的方式(可能通过toString()
表示来计算hashcode)
最后,如果您计划只使用简单类型作为键(如您所说的整数或字符串),请不要担心,这没有什么区别。在这两种情况下,两个不同的项将具有相同的哈希代码。一些例子:
assert(new String("hello").hashCode() == new String("hello").hashCode());
int x = 123;
assert(new Integer(x).hashCode() == new Integer(123).hashCode());
请注意,字符串示例通常不是正确的,正如我之前解释的,这只是因为字符串的hashcode方法根据字符串本身的内容计算值。JavaHashMap
依赖于两个方面:
hashCode()
方法,返回从键生成并在映射内使用的整数
等于(…)
方法,该方法应与计算的哈希一致,这意味着如果两个键具有相同的哈希代码,则它们必须是相同的元素
具体要求如下所示:
- 在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中放置什么,所以我只是猜测)
然后,由于它们是两个不同的对象,尽管具有相同的参数,因此它们将具有不同的哈希代码。这可能是,也可能不是
Integer three = numbersByName.get("three");
Map<String,Integer> numbersByValue = new HashMap<String,Integer>();
numbersByValue.put(Integer.valueOf(1),"one");
numbersByValue.put(Integer.valueOf(2),"two");
numbersByValue.put(Integer.valueOf(3),"three");
... etc
String three = numbersByValue.get(Integer.valueOf(3));