我不知道为什么我可以将任何类型的值传递给HashMap.containsKey()方法。我假设这个方法是一个实例方法(如果我错了,请纠正我) HashMap Class应该受到泛型类型的限制。如果 JAVA 不想约束它,为什么HashMap.put()方法需要匹配参数化的类型...
HashMap<String, String> map = new HashMap<String, String>();
// invalid
// map1.put(1, "a");
我无法将int
值键添加到密钥类型为HashMap
的{{1}} map
。 containsKey()和put()方法之间有什么不同?
String
在上面的代码中,输出了public static void main(String[] args) {
HashMap<String, String> map1 = new HashMap<String, String>();
map1.put("1", "a");
map1.put("2", "b");
map1.put("3", "c");
if (map1.containsKey(1)) {
System.out.println("contain");
}
else {
System.out.println("not contain");
}
}
,编译器没有对象。如果确实如此,那就可以防止这种错误发生!我对吗?如果没有,请指导我说实话。
感谢您阅读我的问题!
答案 0 :(得分:2)
答案围绕着PECS,我解释了这个概念here。
短篇小说是Map<?, ?>
,我不能用通用参数调用Map.containsKey(K)
,即使它在技术上不是消费者方法。通过设置Map.containsKey(Object)
,无论类型是什么,我都可以调用containsKey
,这在通配符绑定的地图中很有用。
答案 1 :(得分:1)
你会注意到Javadoc for HashMap
Map.containsKey()
以Object
为参数。在泛型之前,在Java 1.2中添加了该类,并且当在1.5中添加泛型时,方法签名未被更改。
这意味着当你这样做:
if (map1.containsKey(1)) {
1
自动装箱到Integer
个对象。然后在密钥查找期间,为hashcode()
对象调用Integer
方法,以查看它是否存在于Map
中。并且......它没有。
您需要将int
转换为String
才能使Map<String,String>
正常工作:
if (map1.containsKey(String.valueOf(1)) {
答案 2 :(得分:-1)
containsKey
方法具有以下签名:
public boolean containsKey(Object key)
。
因此,当您传递int
时,它使用参数的equals
方法来确定相等性。
由于您的密钥为Strings
,"1".equals(1)
将返回false。