List
List:存储有序的,可重复的数据 --》”动态“数组
-
ArrayList:作为List接口的主要实现类;线程不安全,效率高;底层使用Object[] 存储
-
LinkerList:对于频繁的插入,删除操作,使用此类的效率比ArrayList高;底层使用双向链表存储
-
Vector:作为List接口的古老实现类,线程安全,效率低;底层使用Object[]存储
ArrayList的源码分析:
jdk7情况下:
ArrayList list=new ArrayList();//底层创建了长度是10的Object[]数组elementData
当此次添加的导致底层elementData数组容量不够,则扩容。
默认情况下,扩容到原来容量的1.5倍,同时需要将原来的数组复制到新的数组中
jdk8中ArrayList的变化:
底层的Object[] elementData初始化为{},并没有创建长为10的数组
第一次调用add()时;底层才创建长度为10的数据,并将数据添加到elementData,后续操作与jdk7无异
小结:jdk7中的ArrayList的对象的创建类似于单例的饿汉式,二jdk8的ArrayList的对象的创建类似于单例中的懒汉式,延迟了数组的创建,节省内存
LinkerList的源码分析:
LinkerList list=new LinkerList();内部声明了Node类型的first和last属性,默认为null(就类似于c里面的双向链表的指针)
常用方法:
因为是Collection的子类,所以Collection的方法都可以使用;之后新增了一些有关索引的方法:
void add(int index,Object obj):在index位置插入obj元素
boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素添加进来
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次次出现的位置,如果不存在返回-1
int LastIndexOf(Object obj):返回obj在集合中末次出现的位置,如果不存在返回-1
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index,Object obj):设置指定index位置的元素为obj
List subList(int fromIndex,int toIndex):返回从fromIndex到Index位置的子集合
总结:常用方法
- 增:add(int index,Object obj)
- 删:remove(int index)
- 改:set(int index,Object obj)
- 查:get(int index)
- 长度:size()
- 遍历:
1,Iterator迭代器方式
2,增强for循环
3,普通的循环