1 ArrayList和LinkedList
ArrayList和LinkedList是平常经常用到的两种集合
1.1 对于两者的底层
ArrayList的底层是使用的数组,而LinkedList的底层使用双向链表
1 // ArrayList 2 transient Object[] elementData; 3 4 // LinkedList 5 transient Node<E> first; 6 transient Node<E> last; 7 private static class Node<E> { 8 E item; 9 Node<E> next; 10 Node<E> prev; 11 12 Node(Node<E> prev, E element, Node<E> next) { 13 this.item = element; 14 this.next = next; 15 this.prev = prev; 16 } 17 }
并且ArrayList实现了RandomAccess,所以其查找数据快,并且从尾部插入数据速度也不错。 而对于LinkedList,向其头部或尾部插入数据快,查找数据(get(index))时,会判断是从尾部还是头部开始查找,但是性能不如ArrayList。
1.2 初始化数组
ArrayList分两种情况,分别是构造函数和添加元素中
构造函数中
ArrayList的构造函数可以无参、指定容量和传入集合。如果你指定了容量>0或者传入了非空集合,这时ArrayList会在执行构造函数时就将其底层数组初始化为你指定的容量或者集合的长度。否则,ArrayList会在你添加元素时再去初始化数组,也就我们所说的懒汉式。添加元素有两种方法add和addAll(假设数组没有初始化)
add添加一个元素,会直接通过grow创建一个长度为10的数组用以初始化.而addAll传入集合时,如果集合长度小于10,则数组长度为10;否则,数组初始化长度为集合长度。
对于LinkedList而言,不用过多说明。
ArrayList和LinkedList中用的多一点的是ArrayList,LinkedList由于实现了Deque接口,可以当作栈来使用。
1.3 有关两者的toString方法
实现如下代码
1 List<Integer> arrayList = Arrays.asList(1, 2, 3, 4); 2 System.out.println("arrayList = " + arrayList); 3 4 LinkedList<Integer> linkedList = new LinkedList<>(arrayList); 5 System.out.println("linkedList = " + linkedList);
输出如下 两者都没有重写toString方法,最终调用的是AbstractCollection实现的toString。这方面的知识有关动态绑定,这里不过多赘述。 但是两者都有一个问题,线程不安全。这就需要说到CopyOnWriteArrayList 后面再具体讨论。
标签:Node,初始化,Java,LinkedList,ArrayList,数组,集合 From: https://www.cnblogs.com/lhbilibili/p/16899511.html