java 数据结构详解---list之ArrayList LinkedList Vector

List(1)

List:列表
有序的Collection
允许重复元素
{1,2,4,{5,2},1,3}
List 主要实现
ArrayList(非同步的)
LinkedList(非同步)
Vector(同步)

List(2)

ArrayList:
以数组实现的列表,不支持同步
List list = Collections.synchronizedList(new ArrayList(...)); //支持同步
利用索引位置可以快速定位访问
不适合指定位置的插入、删除操作
适合变动不大,主要用于查询的数据
和Java数组相比,其容量是可动态调整的
ArrayList在元素填满容器时会自动扩充容器大小的50%
查看程序ArrayListTest.java
 

ArrayListTest.java

public class ArrayListTest {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList=new ArrayList<>();
        arrayList.add(3);
        arrayList.add(2);
        arrayList.add(1);
        arrayList.add(4);
        arrayList.add(5);
        arrayList.add(6);//自动装箱
        arrayList.add(new Integer(6));
        System.out.print("The fourth element is:");
        System.out.println(arrayList.get(3));//get(index)列表有序,索引获得值

        arrayList.remove(3);// remove(index)
        Iterator<Integer>iterator=arrayList.iterator();
        while (iterator.hasNext())
            System.out.print(iterator.next()+" ");//迭代器遍历

        System.out.println();
        arrayList.add(3,10);

        for (Integer i:arrayList)//for-each遍历
            System.out.print(i+" ");
        
        System.out.println();
    }

}

输出结果:

 

List(3)

LinkedList:
以双向链表实现的列表,不支持同步
List list = Collections.synchronizedList(new LinkedList(...)); //转化为支持同步
可被当作堆栈、队列和双端队列进行操作
顺序访问高效,随机访问较差,中间插入和删除高效
适用于经常变化的数据
查看程序LinkedListTest.java
 

LinkedListTest.java

​

public class LinkedListTest {
    public static void main(String[] args) {
        LinkedList<Integer>l1=new LinkedList<>();
        l1.add(3);
        l1.add(2);
        l1.add(5);
        l1.add(6);
        l1.add(6);
        System.out.println(l1.size());
        l1.addFirst(1);//头部添加元素
        l1.addLast(10);//尾部
        l1.add(4,8);//指定位置添加元素
        l1.remove(3);//删除指定位置元素

        for(Integer i:l1)
            System.out.print(i+" ");
        System.out.println();
        System.out.println("--------------华丽丽的分割线---------------");

        LinkedList<Integer>list=new LinkedList<>();//该对象为了测试LinkedList的各项性能
        for(int i=0;i<100000;i++)
        {
            list.add(i);
        }

 traverseByIterator(list);
 traverseByIndex(list);
 traverseByForEach(list);

    }
  public static void traverseByIterator(LinkedList<Integer>list){
      Iterator<Integer>iterator=list.iterator();

//获取系统当前时间,遍历完成后,再获取一次,计算差值即为遍历耗费时间 ,下同。   
     Long start=System.nanoTime();

      while (iterator.hasNext())
      {
          iterator.next();
      }

      Long end=System.nanoTime();
      System.out.println("Iterator遍历耗时: "+(end-start)+"纳秒");
  }

  public static void traverseByIndex(LinkedList<Integer>list){
      Long start=System.nanoTime();

   for(int i=0;i<list.size();i++)
   {
       list.get(i);
   }
      Long end=System.nanoTime();

      System.out.println("Index遍历耗时: "+(end-start)+"纳秒");
  }
    public static void traverseByForEach(LinkedList<Integer>list){
        Long start=System.nanoTime();
       for(Integer i:list)
       {
           ;//do nothing
       }
        Long end=System.nanoTime();

        System.out.println("for-each遍历耗时: "+(end-start)+"纳秒");
    }



}

[点击并拖拽以移动]
​
输出结果:
 
运行结果分析:因为LinkedList是用双向链表实现的列表,在利用索引遍历时,耗时最多。利用Iterator遍历与for-each遍历本质上差距不大。
 
 

List(4)

Vector(同步)
和ArrayList类似,可变数组实现的列表
Vector同步,适合在多线程下使用
原先不属于JCF框架,属于Java最早的数据结构,性能较差
从JDK1.2开始,Vector被重写,并纳入到JCF
官方文档建议在非同步情况下,优先采用ArrayList
查看程序VectorTest.java
 

VectorTest.java

public class VectorTest {
    public static void main(String[] args) {
        Vector<Integer>v1=new Vector<>();
        v1.add(1);
        v1.add(2);
        v1.add(3);
        v1.remove(2);
        v1.add(2,5);
        for (Integer i:v1)
            System.out.print(i+" ");
        System.out.println();
        System.out.println("----------------------------");

     Vector<Integer>v2=new Vector<>();//测试Vector的各项性能
     for (int i=0;i<100000;i++)
     {
         v2.add(i);
     }

     traverseByIterator(v2);
     traverseByIndex(v2);
     traverseByForEach(v2);
     traverseByEnu(v2);
    }
    public static void traverseByIterator(Vector<Integer> vector){
        Iterator<Integer> iterator=vector.iterator();

        Long start=System.nanoTime();
        while (iterator.hasNext())
        {
            iterator.next();
        }
        Long end=System.nanoTime();
        System.out.println("Iterator遍历耗时: "+(end-start)+"纳秒");
    }


    public static void traverseByIndex(Vector<Integer>vector){
        Long start=System.nanoTime();
        for(int i=0;i<vector.size();i++)
        {
            vector.get(i);
        }
        Long end=System.nanoTime();

        System.out.println("Index遍历耗时: "+(end-start)+"纳秒");
    }

    public static void traverseByForEach(Vector<Integer>vector){
        Long start=System.nanoTime();
        for(Integer i:vector)
        {
            ;//do nothing
        }
        Long end=System.nanoTime();
        System.out.println("for-each遍历耗时: "+(end-start)+"纳秒");
    }


    public static void traverseByEnu(Vector<Integer>vector){
        Long start=System.nanoTime();

        for(Enumeration<Integer> enu=vector.elements();enu.hasMoreElements();){
            enu.nextElement();
        }
        Long end=System.nanoTime();
        System.out.println("Enumeration遍历耗时: "+(end-start)+"纳秒");
    }

}

输出结果:

 

List(5)

总结
ArrayList/LinkedList/Vector
同步采用Vector
非同步情况下,根据数据操作特点选取ArrayList/LinkedList
 
 
 
 
 
注:
本文相关内容参考华东师范大学陈良育教授的mooc课程 java 核心技术基础篇
转载请注明出处
发布了6 篇原创文章 · 获赞 4 · 访问量 30

猜你喜欢

转载自blog.csdn.net/qq_44787993/article/details/105723027