HashMap和ArrayList

 

参考:https://mp.weixin.qq.com/s/HoB-rLqE7iYpnOQSR0WlgA

HashMap:

      put:插入一个key时,会利用key计算出一个hash(使用异或,原因:通过异或获取的1,0概率是相等的,使散列分布更加均匀,减少碰撞),再通过hash和数组(Entry[])的容量计算出一个下标i(hash&length-1),这个就是放入的位置,但是因为长度是有限的,默认为16,插入的数据越来越多会有冲突,通过链表解决,链表中的数据大于8就自动转为红黑树。

     get: get(K) 通过K的hashCode找到对应的index,(不同的K可能会有相同的hashCode,所以不同的K可能会对应到相同的index上面)发现该index上面有多个值,即该节点下有个链表。通过index可以拿到Entry对象(Entry对象结构为Entry<K,V>,所以一个index下可能会有多个Entry),通过K的equals方法找到K所在的那个Entr对象。所以重写equals必须重写hashcode方法,重写hashcode也必须重写equals方法。如果不重写equals方法,K又是一个对象,则会调用Object类的equals方法,这个方法是根据两个对象的内存地址来判断的,所以比较的值一定不相等。而我们通过需要根据实际的值来判断。

默认加载因子为0.75,也就是说这个默认加载因子是当hashMap集合底层数组的容量达到75%时,数组就开始扩容。

ArrayList:

默认容量10,超过容量以1.5倍扩容

快速失败机制:ConcurrentModificationException  内部会同一add的次数,在遍历的时候会根据开始记录的次数做比较,如果不同就会报错。

出现的原因:在遍历的同时进行add、remove操作。

内部以elementData[]来按顺序储存数据。

hashcode
posted @ 2021-12-02 16:50  龙之谷2019  阅读(81)  评论(0编辑  收藏  举报