JAVA中的List系列集合ArrayList、LinkedList、Vector

1.集合的分类

集合分为单列集合和多列列集合,如下图

 2.ArrayList集合

● 如何存储数据:ArrayList的底层是用数组来存储数据

● 源码流程:在使用ArrayList的空参构造方法创建ArrayList集合的对象的时候,会创建长度为0的数组。在第一次添加数据的时候,会直接创建一个长度为10的数组来存储数据,如果当添加的数据长度超过了数组的长度,那么就会进行自动扩容,扩容为原来的1.5倍.。

● 扩容流程:在创建了比原来的数组长度大1.5倍的数组之后,会对旧数组的数据进行复制,复制一份到新的数组当中,从而实现数组扩容。

● ArrayList的扩容方式优缺点:

①优点:ArrayList是可以根据需要自动调节以容纳更多的数据,无需手动扩容

②缺点:

扩容时候的性能开销,当ArrayList扩容的时候,需要重新分配更大的内存块,将现有的数据复制到新的内存块当中,这个过程需要消耗一些时间和内存。

频繁扩容导致碎片化:当ArrayList频繁扩容的时候,可能会导致内存碎片化,也就是存在大量的不连续的小块内存空间。

3.LinkedList集合 

●如何存储数据:底层采用双向链表存储数据

●常用的方法有哪些?

添加方法

添加单个元素

添加元素至头部位置将其他集合的元素添加进来

        LinkedList<Integer> linkedList = new LinkedList<>();
        linkedList.add(1);
        linkedList.add(0,5);
        ArrayList<Integer> list = new ArrayList<>();
        linkedList.addAll(list);

根据索引位置获取元素

获取头元素

获取尾元素

        linkedList.get(0);
        linkedList.getFirst();
        linkedList.getLast();

根据元素索引删除元素

删除头元素

删除尾元素等等方法

        linkedList.remove(0);
        linkedList.removeFirst();
        linkedList.removeLast();

3.Vector集合 

Vector是ArrayList的早期版本,也采用数组存储数据,扩容为原来的2倍,是线程安全的

4.三者区别

● ArrayList和LinkedList

①ArrayList是采用数组形式存储数据,而LinkedList是采用双向链表存储数据

②ArrayList查找和增加数据快,删除和插入数据慢,而LinkedList删除和插入数据快,查找和增加数据慢

原因如下:

ArrayList是采用数组存储数据,支持随机访问,所以可以跟组数组的索引获取你想要的数据,所以查找和增加数据速度快;但是因为元素连续存储,导致删除或者插入元素的时候会将该元素后面的所有元素进行移动,从而比较浪费时间。

LinkedList是采用双向链表的形式存储数据,想要根据索引获取数据,那么链表就会进行从头节点或者尾节点进行遍历,直到找到你的索引位置为止,比较浪费时间,但是删除或者插入数据,由于是链表的形式,不会进行大量的数据移动;

③ArrayList能扩容,而LinkedList不能扩容

● ArrayList和Vector

①ArrayList是扩容为原来的1.5倍,而Vector扩容为原来的2倍

②ArrayList是线程不安全的效率快,而Vector是线程安全的,效率慢

③ArrayList只能扩容为原来的1.5倍,而Vector可以在创建对象的时候给定扩容量

ArrayListLinkedListVector都是Java常用的集合类,它们都实现了List接口,但是它们之间有一些异同点。 相同点: 1. 都是实现了List接口,存储有序的、可重复的元素。 2. 都是线程不安全的,即不支持多线程并发访问,需要使用Collections工具类进行同步操作。 3. 都可以通过Iterator迭代器进行遍历操作。 不同点: 1. 底层数据结构不同:ArrayList是基于数组实现,LinkedList是基于链表实现,Vector也是基于数组实现,但是Vector是线程安全的,性能较差。 2. 插入和删除操作的性能不同:ArrayList在插入和删除元素时,需要将插入点后面的元素都向后移一位或将删除点后面的元素都向前移一位,时间复杂度为O(n);LinkedList在插入和删除元素时,只需要修改相邻节点的指针,时间复杂度为O(1);Vector在插入和删除元素时,性能与ArrayList相似。 3. 随机访问的性能不同:ArrayListVector支持随机访问,时间复杂度为O(1);LinkedList不支持随机访问,需要遍历整个链表才能找到指定的元素,时间复杂度为O(n)。 4. 线程安全性不同:ArrayListLinkedList是非线程安全的;Vector是线程安全的,但是在多线程环境下,性能比较差,不建议使用。 综上所述,如果需要高效地进行随机访问,可以选择ArrayListVector;如果需要频繁进行插入和删除操作,可以选择LinkedList;如果需要线程安全,可以选择Vector
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值