workplace-blog

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  30 随笔 :: 0 文章 :: 0 评论 :: 697 阅读

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来插入删除。

posted on   多巴胺LLL  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示