HashMap和ArrayList
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上面有多个值,即该节点下有个链表,则通过K的equals方法判断链表下的数据是否相等。所以重写hashcode必须重写equals方法,如果不重写equals方法,K又是一个对象,则会调用Object类的equals方法,这个方法是根据两个对象的内存地址来判读的,所以比较的值一定不相等。而我们通过需要根据实际的值来判断。
默认加载因子为0.75,也就是说这个默认加载因子是当hashMap集合底层数组的容量达到75%时,数组就开始扩容。
ArrayList:
默认容量10,超过容量以1.5倍扩容
快速失败机制:ConcurrentModificationException 内部会同一add的次数,在遍历的时候会根据开始记录的次数做比较,如果不同就会报错。
出现的原因:在遍历的同时进行add、remove操作。
内部以elementData[]来按顺序储存数据。