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