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可以在创建对象的时候给定扩容量