深入理解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倍


本文详细探讨了ArrayList和LinkedList两种Java集合类的实现方式及其特点。ArrayList基于动态数组,适合查找和修改,但插入删除效率低;LinkedList采用双向链表,增删高效但查询和修改慢。ArrayList初始容量为10,当元素达到数组容量时,会按1.5倍扩容。LinkedList的add方法涉及前后元素的链接操作。对于不同场景,选择合适的集合类型至关重要。
128

被折叠的 条评论
为什么被折叠?



