一、List接口
List承诺可以将元素维护在特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和删除元素。List与 set 不同,列表通常允许重复的元素。并且存放的顺序与插入的顺序一致。,此接口的定义如下:
public interface List<E> extends Collection<E>
二、List接口的扩展方法
No. | 方法 | 类型 | 描述 |
1 | public void add(int index, E element) | 普通 | 在指定位置增加元素 |
2 | public boolean addAll(int index, Collection<? extends E> c) | 普通 | 在指定位置增加一组元素 |
3 | E get(int index) | 普通 | 返回指定位置的元素 |
4 | public int indexOf(Object o) | 普通 | 查找指定元素的位置 |
5 | public int lastIndexOf(Object o) | 普通 | 从后向前查找指定元素的位置 |
6 | public ListIterator<E> listIterator() | 普通 | 为ListIterator接口实例化 |
7 | public E remove(int index) | 普通 | 按指定的位置删除元素 |
8 | public List<E> subList(int fromIndex, int toIndex) | 普通 | 取出集合中的子集合 |
9 | public E set(int index, E element) | 普通 | 替换指定位置的元素 |
三、List接口的常用子类 —— ArrayList和LinkedList
1、ArrayList擅长于随即访问元素,因为它像数组一样提供了下标,可以根据下标直接访问,所以可以将ArrayList看作可扩充自身尺寸的数组。但是在ArrayList的中间插入和移除元素时较慢。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
//添加元素
list.add("aaa");
list.add("bbb");
list.add("aaa");
list.add("ddd");
list.add("ccc");
list.add(null);
//遍历
for (String string : list) {
System.out.println(string);
}
System.out.println("---------------");
//修改
list.set(1, "bbb2");
//删除
list.remove("ccc");
//迭代器遍历
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("--------------");
list.clear(); //清空列表
System.out.println("清空后list的大小"+list.size());//打印大小
List<String> list2 = new ArrayList<String>();
list2.add("a");
list2.add("b");
//将list2添加到list中
list.addAll(list2);
//遍历
for (String string : list) {
System.out.println(string);
}
}
}
2、LinkedList通过代价较低的在List中间进行插入和删除操作,提供了优化的顺序访问。但是在随即访问方面相对比较慢。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
public class LinkedListTest {
public static void main(String[] args) {
List<Integer> arraylist = new ArrayList<Integer>();
for (int i = 0; i < 5000; i++) {
arraylist.add(i);
}
List<Integer> linkedlist = new LinkedList<Integer>();
for (int i = 0; i < 5000; i++) {
linkedlist.add(i);
}
Random rand = new Random(5000);
//随机访问arrayList
long start = System.currentTimeMillis();
for (long i = 0; i < 500000; i++) {
arraylist.get(rand.nextInt(5000));
}
long end = System.currentTimeMillis();
System.out.println("arrayList随机访问时间:"+(end - start));
//随机访问arrayList
start = System.currentTimeMillis();
for (long i = 0; i < 500000; i++) {
linkedlist.get(rand.nextInt(5000));
}
end = System.currentTimeMillis();
System.out.println("linkedlist随机访问时间:"+(end - start));
}
}