深入理解ArrayList和LinkedList!

深入理解ArrayList和LinkedList

ArrayList和LinkedList都是实现了List接口

1 ArrayList底层是由数组来实现的

优点:基于动态的数组实现,有确定的下标,读和改更加容易,存放元素可以重复,也可以为null,有序

缺点:不适合对元素进行频繁的插入和删除,插入和删除都需要做大量的元素移动

特点:集合中默认创建为一个大小为10的数组,执行add方法时,会首先执行ensureCapacity()方法,当元素数量正好为数组大小时,会创建一个新的数组,数组大小为原来数组的1.5倍,然后再将所有元素存放进扩充后的数组

在这里插入图片描述

2 LinkList底层则是由双向链表来实现

优点:由于是由双链表实现的,其头节点和尾节点很容易的进行修改,插入和删除只需修改前一元素的尾节点和后一元素的头节点即可,增删不需要移动原有的元素

缺点:查询和修改需要遍历整个链表来查找元素,不利于查找和修改

特点:执行add方法时,将要插入的位置前一个元素的尾节点指向要插入元素的头节点,要加入元素的头节点指向前一个元素的尾节点,然后要插入元素的尾结点指向后一个元素的头节点,后一个元素的头节点指向要插入元素的尾节点(删除操作类似)

在这里插入图片描述

3、程序测试

当我们创建一个新的ArrayList时,往里面一直添加元素,第一个元素添加后,显示list的size为1,当我们debug进入add方法查看,elementData已经是一个大小为10的数组,说明默认创建就是为一个大小为十的数组

在这里插入图片描述

在这里插入图片描述

当我们添加到第十一个元素时候,再次debug进入add方法,查看此时的elementData数组的大小已经扩充到了15,说明当元素的数量大于当前已经创建的elementData数组的大小时,会对elementData进行扩充,每次扩充1.5倍

在这里插入图片描述

在这里插入图片描述