目录
1.List接口概述
特点:
- 存储的元素都是有序的可重复的。
- 因为其有序和可重复性,我们通常用List接口的实现类来替换数组。
具体实现类的特点
ArrayList:①作为List接口的主要实现类。
②线程不安全的,效率较高。
③底层使用Object数组来进行存储
LinkedList:①底层使用双向链表来进行存储。
②对于频繁的插入和删除操作效率比较高。
Vector:①作为List接口的古老实现类,在Java1就已经存在了。
②线程安全的,效率较低。
③底层使用Object数组来进行存储。
2.ArrayList的底层源码分析
jdk7中的源码分析
①当使用空参构造器创建对象时,底层创建了一个长度为10的Object数组。
②添加数据时,先判断当前Object数组长度是否足够,如果长度足够则直接添加;如果长度不够则先将底层数组长度扩容为原来容量的1.5倍,同时将原有数组赋值给新数组。
建议:因为当底层数组不够长时需要扩容,所以如果知道大概要存储多少数据,则建议使用带参构造器来指定底层数组的长度。
jdk8中的源码分析
①使用空参构造器创建对象时,底层初始化为{}。
②在第一次调用add()方法时底层才创建长度为10的Object数组。
③后续添加数据同jdk7同样。
jdk7中的ArrayList类似于单例模式中的饿汉式,jdk8中的类似于懒汉式,延迟了数组对象的创建,节省了内存。
3.LinkedList的源码分析
在LinkedList中定义了内部类Node,每个Node对象对应双链表中的一个节点。
4.Vector的源码分析
除了在扩容时将容量变为原来容量的两倍之外其他和jdk7中ArrayList一样。
5.List接口中的常用方法
- add(int index,Object obj):向index位置插入obj对象。
- addAll(int index,Collection col):将col中的数据插入到指定位置 。
- get(int index):获取指定位置。
- indexOf(Object obj):返回当前对象在当前list对象中首次出现的索引。
- lastIndexOf(Object obj):返回最后一次出现的索引。
- Object remove(int index):将指定位置的元素删除,并返回。
- Object set(int index,Object obj):将指定位置的元素设置为obj,并返回。
- subList(int index,int endIndex):获取一个子List。