它是以这种方式设计的,因为在 get 操作期间,只有 和 用于确定要返回的对象。该方法的实现不检查用作键的对象的类型。equals
hashCode
get
在您的示例中,您尝试通过传递长 like 来获取值,首先,具有该值的对象的哈希代码将用于确定要从中查找的存储桶。接下来,键的方法用于找出要从中返回值的映射的确切条目。在定义良好的方法中,始终会检查类型:myHashMap.get(1L);
Long
1L
equals
equals
public boolean equals(Object obj) {
if (obj instanceof Long) { //here type is checked
return value == ((Long)obj).longValue();
}
return false;
}
因此,如果类型不相等,则该方法将返回,因此也将返回 。equals
false
get
null
在某些情况下,例如用作键时,可能会发生使用 say 的实例将项目放入映射的情况,但您可以使用 的实例成功检索相同的值。由于两者都实现了接口。List
ArrayList
LinkedList
List
Map<List<String>, String> myHashMap = new HashMap<>();
List<String> arrayList = new ArrayList<>();
List<String> linkedList = new LinkedList<>();
myHashMap.put(arrayList, "foo");
System.out.println(myHashMap.get(linkedList));
上面的代码将在控制台中输出。foo
这里虽然实现是不同的,但是如果你检查的方法,它只检查类型是否是:equals
ArrayList
List
public boolean equals(Object o) {
if (o == this) {
return true;
}
if (!(o instanceof List)) { //checking type of super interface
return false;
}
...
}
对于 .LinkedList