List接口特点

List 接口存储一组允许重复,有序(插入顺序)的对象,有下标,插入顺序作为遍历的顺序。

List接口的三个常用实现类

java list 查找满足条件的第一个元素 java list 搜索_java

使用场景

1、对插入元素数据的速度要求不高,但是要求快速访问元素数据,则使用ArrayList。
2、对访问元素数据速度不做要求不高,但是对插入和删除元素数据速度要求高的情况,则使用LinkedList。
3、有多线程对集合元素进行操作时候,则使用Vector,但是现在一般不再使用Vector,如需在多线程下使用,可以用CopyOnWriteArrayList,在java.util.concurrent包下。
4、有需求是希望后保存的数据先读取出来,则使用Stack;基于数组实现的,是栈,它继承与Vector。

List转数组方法

ArrayList<String> list=new ArrayList<String>();
String[] strings = new String[list.size()];
list.toArray(strings);

数组转成List

String[] s = {"a","b","c"};
List list = java.util.Arrays.asList(s);

性能测试

/*
 * 性能测试,通过插入、随机读取和删除对ArrayList、LinkedList、Vector和Stack进行测试!
 * 结论:看LinkedList
 *  插入10万个元素,LinkedList所花时间最短:17 ms。
 *  删除10万个元素,LinkedList所花时间最短: 9 ms。
 *  遍历10万个元素,LinkedList所花时间最长:10255 ms;而ArrayList、Stack和Vector则相差不多,都只用了几秒。
 *  (1) 对于需要快速插入,删除元素,应该使用LinkedList。
 *  (2) 对于需要快速随机访问元素,应该使用ArrayList。
 * 
 */

public class ListTest {

    private static final int COUNT = 100000; //十万

    private static ArrayList<Object> arrayList = new ArrayList<Object>();
    private static LinkedList<Object> linkedList = new LinkedList<Object>();
    private static Vector<Object> vector = new Vector<Object>();
    private static Stack<Object> stack = new Stack<Object>();

    public static void main(String[] args) {
        System.out.println("....开始测试插入元素..........");

        // 插入元素测试
        insertData(arrayList,"ArrayList") ;
        insertData(linkedList,"LinkedList") ;
        insertData(vector,"Vector") ;
        insertData(stack,"Stack") ;

        System.out.println("....开始测试读取元素..........");

        // 随机读取元素测试
        readAccessData(arrayList,"ArrayList") ;
        readAccessData(linkedList,"LinkedList") ;
        readAccessData(vector,"Vector") ;
        readAccessData(stack,"Stack") ;

        System.out.println("....开始测试删除元素..........");

        // 随机读取元素测试
        deleteData(arrayList,"ArrayList") ;
        deleteData(linkedList,"LinkedList") ;
        deleteData(vector,"Vector") ;
        deleteData(stack,"Stack") ;



    }


    /**
     * 指定的List 的子类中插入元素,并统计插入的时间
     * @param list List 的子类
     * @param name 子类的名称
     */
    private static void insertData(List<Object> list,String name) {
        long startTime = System.currentTimeMillis();

        // 向list的位置0插入COUNT个数
        for (int i=0; i<COUNT; i++){
            list.add(0, i);
        }

        long endTime = System.currentTimeMillis();
        long interval = endTime - startTime;
        System.out.println(name + " : 插入 "+COUNT+"元素, 使用的时间是 " + interval+" ms");
    }

    /**
     * 指定的List 的子类中删除元素,并统计删除的时间
     * @param list List 的子类
     * @param name 子类的名称
     */
    private static void deleteData(List<Object> list,String name) {
        long startTime = System.currentTimeMillis();

        // 删除list第一个位置元素
        for (int i=0; i<COUNT; i++)
            list.remove(0);

        long endTime = System.currentTimeMillis();
        long interval = endTime - startTime;
        System.out.println(name + " : 删除 "+COUNT+"元素, 使用的时间是 " + interval+" ms");
    }

    /**
     * 指定的List 的子类中读取元素,并统计读取的时间
     * @param list List 的子类
     * @param name 子类的名称
     */
    private static void readAccessData(List<Object> list,String name) {
        long startTime = System.currentTimeMillis();

        // 读取list元素
        for (int i = 0; i < COUNT; i++)
            list.get(i);

        long endTime = System.currentTimeMillis();
        long interval = endTime - startTime;
        System.out.println(name + " : 随机读取 "+COUNT+"元素, 使用的时间是 " + interval+" ms");
    }
}

输出结果:

....开始测试插入元素..........
ArrayList : 插入 100000元素, 使用的时间是 970 ms
LinkedList : 插入 100000元素, 使用的时间是 17 ms
Vector : 插入 100000元素, 使用的时间是 968 ms
Stack : 插入 100000元素, 使用的时间是 888 ms
....开始测试读取元素..........
ArrayList : 随机读取 100000元素, 使用的时间是 6 ms
LinkedList : 随机读取 100000元素, 使用的时间是 10255 ms
Vector : 随机读取 100000元素, 使用的时间是 8 ms
Stack : 随机读取 100000元素, 使用的时间是 4 ms
....开始测试删除元素..........
ArrayList : 删除 100000元素, 使用的时间是 1460 ms
LinkedList : 删除 100000元素, 使用的时间是 9 ms
Vector : 删除 100000元素, 使用的时间是 1472 ms
Stack : 删除 100000元素, 使用的时间是 894 ms