美文网首页
java-Java 集合 List总结(LinkedList,

java-Java 集合 List总结(LinkedList,

作者: 望月成三人 | 来源:发表于2016-12-21 10:25 被阅读243次

List概括

先回顾一下List的框架图

Paste_Image.png
  • List 是一个接口,它继承于Collection的接口。它代表着有序的队列。
  • AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。
  • AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数”。
  • ArrayList, LinkedList, Vector, Stack是List的4个实现类。
  • ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。
  • LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率低。
  • Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。
  • Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。

第2部分 List使用场景

学东西的最终目的是为了能够理解、使用它。下面先概括的说明一下各个List的使用场景,后面再分析原因。

如果涉及到“栈”、“队列”、“链表”等操作,应该考虑用List,具体的选择哪个List,根据下面的标准来取舍。

  • 对于需要快速插入,删除元素,应该使用LinkedList。
  • 对于需要快速随机访问元素,应该使用ArrayList。
  • 对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类(如ArrayList)。
  • 对于“多线程环境,且List可能同时被多个线程操作”,此时,应该使用同步的类(如Vector)。

通过下面的测试程序,我们来验证上面的(01)和(02)结论。参考代码如下:

import java.util.*;
import java.lang.Class;

/*
 * @desc 对比ArrayList和LinkedList的插入、随机读取效率、删除的效率
 *
 * @author skywang
 */
public class ListCompareTest {

    private static final int COUNT = 100000;

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

    public static void main(String[] args) {
        // 换行符
        System.out.println();
        // 插入
        insertByPosition(stack) ;
        insertByPosition(vector) ;
        insertByPosition(linkedList) ;
        insertByPosition(arrayList) ;

        // 换行符
        System.out.println();
        // 随机读取
        readByPosition(stack);
        readByPosition(vector);
        readByPosition(linkedList);
        readByPosition(arrayList);

        // 换行符
        System.out.println();
        // 删除 
        deleteByPosition(stack);
        deleteByPosition(vector);
        deleteByPosition(linkedList);
        deleteByPosition(arrayList);
    }

    // 获取list的名称
    private static String getListName(List list) {
        if (list instanceof LinkedList) {
            return "LinkedList";
        } else if (list instanceof ArrayList) {
            return "ArrayList";
        } else if (list instanceof Stack) {
            return "Stack";
        } else if (list instanceof Vector) {
            return "Vector";
        } else {
            return "List";
        }
    }

    // 向list的指定位置插入COUNT个元素,并统计时间
    private static void insertByPosition(List list) {
        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(getListName(list) + " : insert "+COUNT+" elements into the 1st position use time:" + interval+" ms");
    }

    // 从list的指定位置删除COUNT个元素,并统计时间
    private static void deleteByPosition(List list) {
        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(getListName(list) + " : delete "+COUNT+" elements from the 1st position use time:" + interval+" ms");
    }

    // 根据position,不断从list中读取元素,并统计时间
    private static void readByPosition(List list) {
        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(getListName(list) + " : read "+COUNT+" elements by position use time:" + interval+" ms");
    }
}

从中,我们可以发现:

  • 插入10万个元素,LinkedList所花时间最短:29ms。
  • 删除10万个元素,LinkedList所花时间最短:15ms。
  • 遍历10万个元素,LinkedList所花时间最长:10809 ms;而ArrayList、Stack和Vector则相差不多,都只用了几秒。

考虑到Vector是支持同步的,而Stack又是继承于Vector的;因此,得出结论:

  • 对于需要快速插入,删除元素,应该使用LinkedList。
  • 对于需要快速随机访问元素,应该使用ArrayList。
  • 对于“单线程环境” 或者 “多线程环境,但List仅仅只会被单个线程操作”,此时应该使用非同步的类。Vector
  • ArrayList支持序列化,而Vector不支持;即ArrayList有实现java.io.Serializable接口,而Vector没有实现该接口。
  • Vector支持通过Enumeration去遍历,而对于需要快速插入,删除元素,应该使用LinkedList,ArrayList不支持

本文来自: http://www.cnblogs.com/skywang12345/p/3308900.html

相关文章

  • java-Java 集合 List总结(LinkedList,

    List概括 先回顾一下List的框架图 List 是一个接口,它继承于Collection的接口。它代表着有序的...

  • Java学习Day10

    今日学习内容总结 List集合 LinkedList集合 Set接口 HashSet接口 哈希表 可变参数 Col...

  • 一文彻底了解List集合

    一、List集合 List集合是Collection子类。ArrayList、LinkedList、Vector分...

  • java常用集合

    集合 Collection 接口 List LinkedList LinkedList是一个双向链表,往集合中插入...

  • 整理笔记(线程和垃圾回收器)

    1. 集合部分. 集合有List,map,set List有arrayList和LinkedList Array是...

  • 41.集合:List集合特点&特有API、遍历方式、ArrayL

    List系列集合 List集合特点,特有API 特点ArrayList、LinkedList:有序,可重复,有索引...

  • 集合2

    LinkedList集合:是List的子类,能继承List所有的方法,并具有自己的方法LInkedList lin...

  • LinkedList简介

    LinkedList概述 LinkedList底层通过双向集合的数据结构实现,LinkedList可以作为List...

  • java集合

    java集合 集合之间的关系 Collection├List│├LinkedList│├ArrayList│└Ve...

  • 单列集合

    List集合  1.List常见集合ArrayList和LinkedList   1.ArrayList是一种单列...

网友评论

      本文标题:java-Java 集合 List总结(LinkedList,

      本文链接:https://www.haomeiwen.com/subject/ifqqvttx.html