List接口概述
鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组
List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据 序号存取容器中的元素。
JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。
个人理解如下:
List是一个动态数组,不用担心不够脚标越界的异常,或者太大占用内存,浪费启动时间。
--------------------------------------------------------------------------------------------------------------------------------
Collection接口:单列集合,用来存储一个一个兑现
List接口:存储有序的、可重复的数据。且动态替换原有数组
实现类:ArrayList:作为list接口的主要实现类,线程不安全,效率高;底层使用 Object[ ] elementData存储
LinkedList:对于多数据且频繁的插入、删除操作, LinkedList比ArrayList效率高;底层使用双向链表双向链表
Vector:古老实现类,一开始属于jdk1.0的,后来jdk1.2出来后到jdk1.2下,不怎么用。线程安全,效率低;底层使用 Object[ ] elementData存储
2.ArrayList在jdk7中的对象创建类似于单列的饿汉式(在底层创建长度为10的Objec),而在
jdk8中的对象创建类似于单列的懒汉式(底层的Object[] elemenData初始化为{ }.({空})并没有创
建长度,第一次add()时创建长度为10的数组);且两者如果下次list.add()导致底层
elementData数组不够,这扩容默认情况下为原容量的1.5倍(jdk8是1.5倍+2),同时将原有的数
组中的数据复制到新的数组中。
3.LinkedList(建议了解且会用就就可以,如果想深层次的了解学习算法可以看源码)
在内部声明了Node类型的first和last属性默认为空,双向链表结构: [first,“数据”,last]
首个为[null,“数据”,last],末尾为[first,“数据”,null],即first指向上一个,last指向下一个,创建删除即first指向上上一个,或last指向下下一个,就是三个数之间的关系。
4. Vector:在底层创建长度为10的Objec,扩容为两倍。
面试题:ArrayList、LinkedList、Vector三者的异同?
同:三个类都实现了list接口,存储数据的特点相同:存储有序的、可重复的数据
不同:见上
--------------------------------------------------------------------------------------------------------------------------------
List接口方法
List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引来 操作集合元素的方法。
void add(int index, Object ele):在index位置插入ele元素
boolean addAll(int index, Collection eles):从index位置开始将eles中 的所有元素添加进来
Object get(int index):获取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出现的位置
int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
Object remove(int index):移除指定index位置的元素,并返回此元素
Object set(int index, Object ele):设置指定index位置的元素为ele
List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex 位置的子集合
红色为频繁较多使用
总结:常用方法
增:add(int index)
删:remove(int index)/ remove(Object obj)
改:set(int index, Object ele)
查:get(int index)
插:add(int index,Object ele)
长度:size()
遍历:1.Iterator迭代器方式
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
2.增强for循环
for(Object obj : list){
System.out.println(obj);
}
3.普通循环
for(int i = 0;i < list.size(); i++){
System.out.println(list.get(i))
}
4.面试题
4.1
@Test
public void testListRemove() {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
updateList(list);
System.out.println(list);//
}
private static void updateList(List list) {
list.remove(2);
}
4.2
@Test
public void testListRemove() {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
updateList(list);
System.out.println(list);//
}
private static void updateList(List list) {
list.remove(new Integer(value:2));
}
--------------------------------------------------------------------------------------------------------------------------------
注解:博主新人写给自己和分享如有错误,请理解,欢迎指出问题 谢谢 谢谢 谢谢。 2021.6
答案:4.1[1,2] 4.2[1,3]