一,什么是HashMap
HashMap是个散列表,存储的形式是 key-value 对应方式,根据键值的 HashCode 值来存储数据。
HashMap最多只支持一个键值 key 为 null 的数据,之后的键值 key 为 null 的会覆盖之前的数据。
HashMap的存储是无序的。
HashMap的 键值 key 和 数据 value 类型可以不同,可以是同为String类型的 key 和 value ,也可以是 int类型 的 key 和 String 类型的 value 。
二,HashMap判断是否相等
HashMap使用AbstractMap的equals方法,源码分析如下:
//假设伪代码 a.equals(o) a与o都是Map类型的
public boolean equals(Object o) {
//判断地址是否相同,是返回true
if (o == this)
return true;
//判断输入o是否为Map类型,不是返回false
if (!(o instanceof Map))
return false;
//将被比较的对象 o 赋给中间量 m
Map<?,?> m = (Map<?,?>) o;
//比较 m 和 a 的size大小是否相等,不相等返回false
if (m.size() != size())
return false;
try {
//定义迭代器 i 迭代 a
Iterator<Entry<K,V>> i = entrySet().iterator();
//迭代每个迭代器 i 中的每个元素
while (i.hasNext()) {
//定义一个映射条目 e 为 迭代器 i 的下一个元素
Entry<K,V> e = i.next();
//定义键值和值
K key = e.getKey();
V value = e.getValue();
//判断值是否为null,进行下个判断
if (value == null) {
//判断 m 中键值是否为 e.getKey() 是否得到返回null 同时 m 中是否有键值为
e.getKey()的键值,不满足则返回false
if (!(m.get(key)==null && m.containsKey(key)))
return false;
} else {
//如果value != null ,判断 value 值是否等于 m根据键值 key
获得的 value 值相等,如果不是返回false
if (!value.equals(m.get(key)))
return false;
}
}
} catch (ClassCastException unused) {
//出现类转换错误返回 false
return false;
} catch (NullPointerException unused) {
//出现空指针错误返回 false
return false;
}
return true;
}
== 是比较引用地址是否相等,HashMap.equals()是比较Map中的每个键值 key 和 值 value 是否相等。