一.ArrayList和LinkedList的区别以及优缺点
ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
在ArrayList集合中添加或者删除一个元素时,当前的列表所所有的元素都会被移动。而LinkedList集合中添加或者删除一个元素的开销是固定的。
LinkedList集合不支持高效的随机随机访问(RandomAccess),因为可能产生二次项的行为。
ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
我们进行对元素的增删查操作的时候,进行查操作时用ArrayList,进行增删操作的时候最好用LinkedList。
二.ArrayList源码分析
方法源码分析
add
remove
快速失败机制
关于遍历时删除
分析 ArrayList 扩容机制
add
1 | /** |
ensureCapacityInternal()
1 | //得到最小扩容量 |
ensureExplicitCapacity()
1 | //判断是否需要扩容 |
grow()
1 | /** |
hugeCapacity()
1 | /** |
System.arraycopy()
1 | /** |
Arrays.copyOf()
1 | /** |
ensureCapacity
最好在 add 大量元素之前用 ensureCapacity
方法,以减少增量重新分配的次数
1 | /** |
三.无序性和不可重复性的含义是什么
无序性:不等于随机性。存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数组的哈希值决定的
不可重复性:保证添加的元素按照equals()判断时,不能返回true,即相同的元素只能添加一个,需要同时重写equals()方法和hashcode()方法
四.HashMap源码分析
方法源码分析
HashMap hash
1 | static final int hash(Object key) { |
衡量数组是否需要扩增
1 | // loadFactor加载因子 |
put方法逻辑分析
1 | public V put(K key, V value) { |
1 | //当桶数组 table 为空时,通过扩容的方式初始化 table |
扩容机制
resize
1 | final Node<K,V>[] resize() { |
五.LinkedHashMap 源码详细分析
六.ConcurrentHashMap 源码详细分析
方法源码分析
构造方法
1 | /** |