我们先来看一下,Java API文档中,是如何描述这两个方法的。
———————————————————————————————————————————
get
V get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
更确切地讲,如果此映射包含满足 (key==null ? k==null : key.equals(k)) 的键 k 到值 v 的映射关系,则此方法返回 v;否则返回 null。(最多只能有一个这样的映射关系)。
如果此映射允许 null 值,则返回 null 值并不一定 表示该映射不包含该键的映射关系;也可能该映射将该键显示地映射到 null。使用 containsKey操作可区分这两种情况。
参数:
key - 要返回其关联值的键
返回:
指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
抛出:
ClassCastException - 如果该键对于此映射是不合适的类型(可选)
NullPointerException - 如果指定键为 null 并且此映射不允许 null 键(可选)
——————————————————————————————————————————
containsKey
booleancontainsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true。更确切地讲,当且仅当此映射包含针对满足 (key==null ? k==null : key.equals(k)) 的键 k 的映射关系时,返回 true。(最多只能有一个这样的映射关系)。
参数:
key - 测试是否存在于此映射中的键
返回:
如果此映射包含指定键的映射关系,则返回 true
抛出:
ClassCastException - 如果该键对于此映射是不合适的类型(可选)
NullPointerException - 如果指定键为 null 并且此映射不允许 null 键(可选)
——————————————————————————————————————————
由于Map集合允许值对象为null,并且没有个数限制,所以当get()方法的返回值为null时,可能有两种情况:
①是在集合中没有该键对象,
②是该键对象没有映射任何值对象,即值对象为null。
因此,结合Java API中所述,在Map集合中不应该利用get()方法来判断是否存在某个键,而应该利用containsKey()方法来判断,示例如下:
import java.util.HashMap;
import java.util.Map;
public class MapDemo1 {
public static void main(String[] args) {
Map map = new HashMap();
map.put(1, "A");
map.put(2, null);
System.out.println( map.get(1)); //A
System.out.println(map.get(2)); //null
System.out.println(map.get(3)); //null
System.out.println("==================================");
System.out.println( map.containsKey(1)); //true
System.out.println(map.containsKey(2)); //true
System.out.println(map.containsKey(3)); //false
}
}
运行结果如下:
A
null
null
==================================
true
true
false
总结:
Map集合中不应该利用get()方法来判断是否存在某个键,因为map的key值不存在时,或者key存在,但value为null时,都是返回null!
对于Map集合的key值判断,应该利用containsKey()方法进行判断!