1、HashMap、CurrentHashMap、LinkedHashMap、TreeMap

本文详细比较了HashMap在JDK1.7和1.8的区别,包括数据结构、扩容机制和插入策略。同时介绍了CurrentHashMap的线程安全实现,1.7中的Segment分段锁与1.8的直接节点加锁。接着讨论了LinkedHashMap与HashMap的差异,着重强调了有序遍历的特点。最后提到了TreeMap,解释了其默认的排序规则以及自定义排序的方式,底层基于红黑树实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、HashMap jdk1.7和1.8中的区别

  1. 底层数据结构不一样,1.7中使用数组+链表,1.8使用数组+链表+红黑树。
    数组默认大小为16,负载因子为0.75,如果HashMap的size大于16*0.75就要扩容了,扩容方式为创建一个新数组,大小为16乘以2,然后重新rehash操作;
    1.8中当链表长度大于8(默认值)时采用红黑树,红黑树是一种自平衡二叉树,能够防止所有节点在同一侧(线性结构),从而提高查询性能(线性结构跟链表差不多,时间复制度O(n)),红黑树如何判断是左节点还是右节点,需要key实现Comparable接口;

  2. 插入链表时不同,1.7中待插入节点总是插入链表的头部,1.8中则是插入链表的表尾。
    1.7在多线程环境下扩容时会存在死循环情况,究其原因就是1.7中把节点插入到链表头部,如:链表A->B->C,第一次扩容时应该是C->B->A,如果在变成B->A时又有一个线程扩容,那么就可能出现A->B,这样就出现AB死循环了;
    1.8则不会出现以上死循环情况,因为它总是插入链表表尾,顺序永远都是A->B->C;

  3. 根据key的hashcode求数组下标时算法不一样,内部大量应用位操作(左移、右移、&等等),位操作更快,性能更好。
    1.7更加复杂,因为它需要尽可能避免哈希冲突,哈希冲突多了链表就长了,链表的查询性能很差&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值