作者:mobiledu2502870747 | 来源:互联网 | 2022-10-28 11:15
我已经像这样实例化了我的HashMap:
Map myHashMap = new HashMap();
的数据类型Key
为String,因此当我尝试在地图中插入新的键值对并保持Key
Integer时,它将引发错误。
myHashMap.put(1L, "value");
这意味着在put方法中,他们已经限制了的数据类型Key
。但是,当使用get
方法从映射中获取值时,它并不会检查的数据类型Key
。因此,如果我写这样的东西,它不会给出编译错误。
myHashMap.get(1L);
我get
在Java Map界面中检查了该方法,其参数类型为Object
,因此这就是为什么它允许将任何Object用作put方法参数的原因。
V get(Object key)
有什么方法可以限制在get
方法中作为参数传递的数据类型?
我传递的参数应具有与Key
实例化哈希映射时使用的数据类型相同的数据类型。
1> Fullstack Gu..:
这样设计是因为在get操作过程中,仅equals
and hashCode
用于确定要返回的对象。该get
方法的实现不检查用作键的Object的类型。
在您的示例中,您尝试通过传递long来获取值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
。
在某些情况下(例如,List
用作键时),可能会发生这样的情况:您使用say的实例在地图上放置了一个项目,ArrayList
但是您可以使用的实例成功检索相同的值LinkedList
。由于两者都实现了List
接口。
Map, String> myHashMap = new HashMap<>();
List arrayList = new ArrayList<>();
List 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
。
这是一个很好的示例,说明了如何在StackOverflow中编写答案-格式正确,内容丰富,并带有针对性的代码示例。做得好!