HashMap链表转红黑树源码解析

HashMap链表转红黑树需要同时满足两个条件:
1.table数组长度>=64
2.链表长度>8

当调用put方法添加元素到map时,链表转红黑树的入口是treeifyBin(tab, hash)方法。为了让元素集中添加到某个桶bucket中,简单粗暴的做法是写一个类,重写hashCode和equals方法

/**
 * 想要HasMap都分配到同一个桶上,就要保证hashCode一样,所以本类重写了hashCode方法,并且都返回1111
 * HashMap判断key是否相等,是用==号,比较的是内存地址。所以new两个User对象,用==号比较肯定是false
 * 重写equals方法,永远返回false,这样HashMap就不会认为key是一样的了。就会往同一个桶插入user对象,
 * 直到链表长度超过8,就可以演示链表转红黑树的现象。
 *
 * HashMap是这样判断key相等的,相等就把旧值替换为新值
 * 这里key不等(都是new出来的,所以==号结果是false)
 * equals也不等,因为重写了返回为false
 * if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))    // p是链表表头
 *     e = p;
 *
 * @author: lbj
 * @create: 2020-07-31 23:56
 */
public class User {
   
    @Override
    public boolean equals(Object o) {
   
        return false;   // 故意
    }

    @Override
    public int hashCode() {
   
        return 1111;    // 故意
    }
}

写个demo,for循环100次往map里添加元素,当添加到第9个元素的时候,才进入到treeifyBin方法

public class HashMapTest {
   
    public static void main(String[] args) {
   
        HashMap map = new HashMap<</
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值