74.HashMap
-
Map接口常用实现类:HashMap、Hashtable和Properties
-
HashMap是Map接口使用频率最高的实现类
-
HashMap是以key-value对的方式来存储数据
-
key不能重复,但是值可以重复,允许使用null健和null值
-
如果添加相同的key,会覆盖原来的key
-
与HashSet一样,不保证映射的顺序,因为底层是以hash表的方式来存储的
-
HashMap没有实现同步,因此线程是不安全的,方法没有做同步互斥的操作,没有synchronized
HashMap底层扩容机制:
-
HashMap底层维护了Nod类型的数组table,默认为null
-
当创建对象时,将加载因子(loadfactor)初始化为0.75
-
当添加key-val时,通过key的哈希值得到在table的索引。然后判断该索引处是否有元素,如果没有元素直接添加。如果该索引处有元素,继续判断该元素的key是否和准入加入的key相等,如果相等,直接替换val;如果不相等需要判断是树结构还是链表结构,做出相应处理。如果添加时发现容量不够,需要扩容
-
第1次添加,则需要扩容table容量为16,临界值为12
-
以后再扩容,则需要扩容table为原来的2倍,临界值为原来的2倍,既24,以此类推
模拟HashMap触发扩容,树化情况
public class HelloJava {
public static void main(String[] args) {
HashMap hashMap = new HashMap();
for (int i = 1;i <= 12;i++){
hashMap.put(new A(i),"hello");
}
hashMap.put("aaa","bbb");
System.out.println("hashMap=" + hashMap);
}
}
class A{
private int num;
public A(int num) {
this.num = num;
}
//所有的A对象的HashCode都是100
@Override
public int hashCode() {
return 100;
}
@Override
public String toString() {
return "A{" +
"num=" + num +
'}';
}
}