1、 list集合和数组的比较
- 数组:是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)
- 集合:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变。(底层还是数组)
- 集合和数组的区别:
- 共同点∶都是存储数据的容器
- 不同点︰数组的容量是固定的,集合的容量是可变的
2、 为什么使用集合而不是数组
- 集合和数组相似点:
- 都可以存储多个对象,对外作为一个整体存在
- 数组的缺点
- 长度必须在初始化时指定,且固定不变
- 数组采用连续存储空间,删除和添加效率低下、数组无法直接保存映射关系
- 数组缺乏封装,操作繁琐 解决:集合框架应用而生:存储不确定数量的数据(可以动态改变集合长度)
3、 List集合 List集合的主要实现类有ArrayList和LinkedList,分别是数据结构中顺序表和链表的实现。另外还包括栈和队列的实现类:Deque和Queue。特点:有序 不唯一(可重复)
- ArrayList(数组)
- 在内存中分配连续的空间,实现了长度可变的数组
- 优点:遍历元素和随机访问元素的效率比较高
- 缺点︰添加和删除需大量移动元素效率低,按照内容查询效率低
- LinkedList(双向链表)
- 缺点∶遍历和随机访问元素效率低下
- 优点:插入、删除元素效率比较高(但是前提也是必须先低效率查询才可。如果插入删除发生在头尾可以减少查询次数)
4、 List的常用方法 5、 List源码解析
- 看继承结构
- 看这个类的继承结构,处于一个什么位置,不需要背记,有个大概的感觉就可以
- 看全局变量
- 一般在全局变量中会做很多初始化事情。
- 看构造方法
- 一般在构造方法中会做很多事情,要跟踪方法中的方法。
- 看常用方法
- 没必要所有方法都去了解,知道常用、核心的方法实现即可。
6、 ArrayList和LinkedList和Vector的区别
7、List源码解析
1、ArrayList默认容量是10,底层是数组;elementData:实际存储元素的地方
2、elementData:指向DEFAULTCAPACITY_EMPTY_ELEMENTDATA:说明调的是无参构造器,默认容量是10(第一次添加元素时初始化容量为10)
3、方法:calculateCapacity(Object[] elementData, int minCapacity):确定需要多少容量
4、方法ensureExplicitCapacity(int minCapacity)判断是否需要扩容
5、方法grow(minCapacity)扩容1.5倍:生成一个新数组,赋值给elementData 解决数组长度不可变的问题
6、缩容:删除元素:先找到这个元素,再将此元素后所有的元素往前移动一位
7、modCount++:多线程的情况下:A线程在遍历数据,B线程在继续存放数据(只有新增或删除元素的时候modCount才会++):保证数据一致性(保证在遍历的时候数据不会发生变化)
评论