HashMap
特点:
- jdk1.2,运行效率快,线程不安全,允许null作为key或者value
使用:
- 存储结构:哈希表(数组+链表+红黑树)
- 使用key的hashcode和equals判重
//创建
HashMap<student,String> hashmap =new HashMap<>();
//添加
hashmap.put(s1,"string1");
hashmap.put(s2,"string2");
hashmap.put(s3,"string3");
//删除
hashmap.remove(s1);
//遍历
for (Teacher t:hashMap.keySet() ) {
System.out.println(t + "-------->" + hashMap.get(t));
}
for (Map.Entry<Teacher,String> entry: hashMap.entrySet()) {
System.out.println(entry);
}
//判断
System.out.println(hashMap.isEmpty());
System.out.println(hashMap.containsKey(t4));
源码分析:
- 初始容量
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
- 最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;
- 加载因子(数据数大于当前哈希表容量的0.75倍时进行扩容)
static final float DEFAULT_LOAD_FACTOR = 0.75f;
- 链表变红黑树的节点(当链表的长度大于8,数组长度大于64时,链表向红黑树转换)
static final int TREEIFY_THRESHOLD = 8;
static final int MIN_TREEIFY_CAPACITY = 64;
- 红黑树变为链表的节点(当链表长度小于6,红黑树调整为链表)
static final int UNTREEIFY_THRESHOLD = 6;
- 哈希表中的数组(哈希桶)
transient Node<K,V>[] table;
- 无参构造
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
- put方法
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
-
总结
- HashMap刚创建时,table的容量为0,为了节省内存空间,当插入第一个元素后table容量调整为16。
- 当元素个数大于阈值(table当前容量*加载因子)时,进行扩容,每次扩容为原容量的两倍,目的为减少调整元素个数。
- 当链表的长度大于8,数组长度大于64时,链表调整为红黑树,目的为提高执行效率。
- 当链表长度小于6,红黑树调整为链表。
- jdk1.8以前插入元素使用头插法,jdk1.8以后使用尾插法。
-
tips:HashMap和HashSet
HashSet底层使用的为HashMap结构,使用HashMap的key来插入删除。
标签:HashMap,Day07,链表,static,key,集合,final,hashmap From: https://www.cnblogs.com/workplace-blog/p/16628960.html