一.List接口概述
-
在List接口中值可重复
-
含有三个常用的实现类:
-
ArrayList
-
LinkedList
-
Vector
-
-
List接口中含有索引值,因此含有get()方法,可以获取属性
二.List常用类及方法介绍
1.ArrayList实现类
-
底层为数组结构,因此在ArrayList中查询快,但是添加/删除时需要移动大量元素,效率低
-
继承自AbctractList,实现了List接口
-
允许null存在
-
同时还实现了Random,Cloneable,Serizlizable接口,因此支持快捷访问,克隆,序列化
成员变量
private int size;
transient Object[] elementDate;
注:
这里的size是指elementDate中实际有多少个元素,而elementDate.length为集合容量,表示最多可以容纳多少个元素
构造方法
①ArrayList< > ( );
//默认无参构造方法,创建一个长度为10的底层数组,第一次添加元素时,真正添加到里面
ArrayList<String> alist = new ArrayList();
②ArrayList< >(20);
//指定长度
ArrayList<String> alist = new ArrayList(20);
常用方法
//向指定位置添加元素
alist.add(0,"d");
System.out.println(alist);
//获取指定索引元素
System.out.println(alist.get(2));
//返回指定元素第一次出现的位置
int a = alist.indexOf("b");
System.out.println(a);
//删除指定位置元素,并返回元素
System.out.println(alist.remove(1));
//替换指定位置元素
System.out.println(alist.set(1,"B"));
-
removeRange()方法;
//删除指定区间元素
//是一个用protected修饰的受保护方法,因此使用时不能直接调用,需用子类继承父类ArrayList,才可以使用
import java.util.ArrayList;
public class MyArrayList extends ArrayList {
public static void main(String[] args) {
/*
removeRange()为受保护的方法,需用子类继承父类再进行调用
*/
MyArrayList myArrayList = new MyArrayList();
myArrayList.removeRange(0,3); //删除指定区间的元素
}
}
-
sort()方法
//对集合中的元素进行排序
import java.util.ArrayList;
import java.util.Comparator;
public class ArrayListDemo3 {
public static void main(String[] args) {
ArrayList <String> a = new ArrayList();
a.add("a");
a.add("f");
a.add("c");
a.add("b");
//new接口(){方法重写} 创建了一个匿名内部类对象
a.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
//创建一个自定义String比较器类的对象
// a.sort(new StringComparator());
System.out.println(a);
}
}
2.LinkedList实现类
-
底层为双向链表结构,双向链表的每个节点用内部类Node表示.LinkedList通过first和last引用分别指向链表的第一个和最后一个元素.当链表为空时first和last都指向null
-
使用LinkedList查询元素较慢,但删除和添加元素效率高
-
继承自AbstractSequentialList,同时实现了List和Deque接口
私有内部类Node
private static class Node<E>{
E item;
Node<E> next;
Node<E> prev;
}
构造方法
①LinkedList< > ( )
//无参构造方法
LinkedList l = new LinkedList();
常用方法
l.add("a"); //向集合中添加元素,每添加一个,创建一个Node对象
l.get(2); //获取指定位置的元素
//方法类似二分查找,判断index < (size/2),如果大于,则从头开始查找,否则从结尾开始查找,节省效率
3.Vector实现类
-
底层也为数组实现
-
是线程安全的
构造方法
①Vector()
//构造一个空向量,其内部数组的大小默认为10
②Vector(Collection c)
//构造一个包含指定collection中的元素的向量,这些元素按其collection的迭代器返回元素的顺序排序
三.List小面试题
package collection.list.arraylist;
/*
区分list中 remove(int index) 和 remove(Object obj)
*/
import java.util.ArrayList;
import java.util.List;
public class ListTest {
public static void main(String[] args) {
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); //此处插入的为下标值,所以删除的为"3",而非"2"
list.remove(new Integer(2)); //将数字"2"装箱,则删除的为数字"2"
}
}