最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

HashMap

运维笔记admin21浏览0评论

HashMap

HashMap

hashMap.put(key,value)---entry对象---根据计算hash值---按位与----得到下标 jdk1.7 put ---判断数组是否为空,如果为空进行初始化,初始化的是数组容量(@Q6:必须为2的幂次方) ---判断key是否为空,执行方法,key为null存在index为0的位置 ---根据key得到hash,对key进行hashcode,(@Q9进行右移和异或运算) ---根据hash值和容量得到下标,indexFor方法(@Q6hash值s与容量-1进行按位与操作) ---覆盖逻辑,遍历链表,短路与先判断hash值是否相等,再判断key,value覆盖,返回oldvalue ---addEntry(hash,key,value,i),先有(@Q6扩容机制),再根据四个值,头插法或尾插法插入 get ---判断key是否为空 ---根据key获得entry,计算hash值,得到下标,遍历链表,先比较hash再比较key,就得到了 ---根据entry获得value jdk1.8 1---判断数组是否为空,调用resize方法进行初始化(resize方法李有初始化逻辑和扩容逻辑) 1---判断数组元素是否为空(计算出下标得到的这个数组元素,其实就是头节点) 2---为空则添加新节点 1---数组元素不为空意味着存在一个或一个以上元素,则为链表或红黑树 2---判断hash值和key,短路与操作,是同一个节点则继续往下执行2,不是则执行判断3 3---判断是否为红黑树 4---是树,则添加新节点 4---不是树则为链表,遍历链表,判断是否为尾节点 5---是尾节点则添加新节点 4---判断hash和key,返回e执行下一步的2操作覆盖操作 2---同一个节点则执行覆盖操作,同jdk1.7 结果不是了添加新节点,就是因为相同所以覆盖原来的旧节点 jdk1.8先加数据再扩容,如果扩容可以解决链表太长问题就不变红黑树

1.7和1.8差不多流程都是 1.判断数组是否为空 2.遍历链表(1.8就是多加了遍历红黑树) 3.判断hash和key,相同则覆盖,不同就是加新元素

发布评论

评论列表(0)

  1. 暂无评论