Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在HashMap中设置键类型?_Java_Hashmap_Key - Fatal编程技术网

Java 如何在HashMap中设置键类型?

Java 如何在HashMap中设置键类型?,java,hashmap,key,Java,Hashmap,Key,嗨 我想创建一个存储表达式的HashMap(java),这是我创建的一个小对象。 如何选择要使用的钥匙类型?整数和字符串对我来说有什么区别?我想我只是不完全理解HashMap背后的想法,所以我不确定使用什么键。 谢谢 键及其关联值都是对象。当您从HashMap中获取某些内容时,必须将其转换为它所表示的对象的实际类型(我们可以这样做,因为Java中的所有对象都继承对象类)。因此,如果键是字符串,值是整数,则可以执行以下操作: Integer myValue=(Integer)myMap.get(“

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

键及其关联值都是对象。当您从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的更多详细信息,请参阅。

Java
HashMap
依赖于两个方面:

  • 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方法根据字符串本身的内容计算值。

Java
HashMap
依赖于两个方面:

  • 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));