• java.util.ArrayList,java.util.LinkedList,java.util.Vector的区别,使用场合.


    下图是Collection的类继承图

    从图中可以看出:Vector、ArrayList、LinkedList这三者都实现了List 接口.所有使用方式也很相似,主要区别在于实现方式的不同,所以对不同的操作具有不同的效率。

    ArrayList  就是动态数组,是Array的复杂版本,动态的增加和减少元素.当更多的元素加入到ArrayList中时,其大小将会动态地增长。

    Vector 和ArrayList类似, 区别在于Vector是同步类(synchronized).因此,开销就比ArrayList要大。

    LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比。它还实现了 Queue 接口,该接口比List提供了更多的方法,包括 offer(),peek(),poll()等.

    注意: 默认情况下ArrayList和Vector的初始容量都是10,所以如果可以预估数据量的话,分配一个较大的初始值属于最佳实践,这样可以减少调整大小的开销。

    接下来将Vector 和ArrayList 、 ArrayList和LinkedList进行两两对比

    ArrayList和Vector

    先看一下构造方法

    public Vector(int paramInt1, int paramInt2) //使用指定的初始容量和容量增量构造一个空的向量
    public Vector(int paramInt) //使用指定初始容量其标准容量增量为零的空向量
    public Vector() //使用指定的初始容量为10和容量增量为零的空向量
    public Vector(Collection<? extends E> paramCollection) //构造一个包含指定 collection 中的元素的向量
    public ArrayList(int paramInt) //构造一个具有指定初始容量的空列表
    public ArrayList() //构造一个初始容量为10的空列表
    public ArrayList(Collection<? extends E> paramCollection) //构造一个包含指定 collection 的元素的列表
    Vector比Arraylist多一个构造方法,就是public Vector(int paramInt1,int paramInt2)这个构造方法,paramInt2就是容量增长,即增长因子,ArrayList中是没有的。

    下面再来看看Arraylist和Vectora的add方法
    复制代码
      public boolean add(E paramE)
      {
        ensureCapacityInternal(this.size + 1);
        this.elementData[(this.size++)] = paramE;
        return true;
      }
    private void ensureCapacityInternal(int paramInt) { if (this.elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { paramInt = Math.max(10, paramInt); } ensureExplicitCapacity(paramInt); }
    private void ensureExplicitCapacity(int paramInt) { this.modCount += 1; if (paramInt - this.elementData.length > 0) { grow(paramInt); } }
    private void grow(int paramInt) { int i = this.elementData.length; int j = i + (i >> 1); if (j - paramInt < 0) { j = paramInt; } if (j - 2147483639 > 0) { j = hugeCapacity(paramInt); } this.elementData = Arrays.copyOf(this.elementData, j); }
    复制代码
    复制代码
     public synchronized boolean add(E paramE)
      {
        this.modCount += 1;
        ensureCapacityHelper(this.elementCount + 1);
        this.elementData[(this.elementCount++)] = paramE;
        return true;
      }
    
    private void ensureCapacityHelper(int paramInt)
      {
        if (paramInt - this.elementData.length > 0) {
          grow(paramInt);
        }
      }
    
     private void grow(int paramInt)
      {
        int i = this.elementData.length;
        int j = i + (this.capacityIncrement > 0 ? this.capacityIncrement : i);
        if (j - paramInt < 0) {
          j = paramInt;
        }
        if (j - 2147483639 > 0) {
          j = hugeCapacity(paramInt);
        }
        this.elementData = Arrays.copyOf(this.elementData, j);
      }
    复制代码

    1、ArrayList在内存不够时默认是扩展50% + 1个;Vector是当增长因子>0,默认扩展增加一个增长因子,否则默认扩展1倍。

    2、Vector的方法加了synchronized, 而ArrayList则没有。Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销

    LinkedList和ArrayList的区别

    LinkedList和ArrayList的差别主要来自于ArrayList和LinkedList数据结构的不同:

    1) 因为ArrayList是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。ArrayList获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。

    2) 相对于ArrayList,LinkedList插入是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。

    3) 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

    4) LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。

      Vector       ArrayList  LinkedList
    实现方式 数组来实现 数组来实现 双向链表
    线程安全 方法加了synchronized    
    效率  
    查询快
    在尾部添加效率高
    在头部添加 要快很多
    删除数据     要快很多
    遍历  
    for         :1062865 ns
    foreach : 2413494 ns
    Iterator :1276122 ns
    遍历的时候:选 for
    Iterator :1080352 ns
    foreach : 2191874 ns
    for         :84410739 ns
    遍历的时候:选 Iterator

    注:此文章来自:https://www.cnblogs.com/jadehy/p/6673928.html
     
     
     
     
     
     
     
  • 相关阅读:
    linux常用命令
    linux简介
    vmware+CentOs 6.9的安装步骤
    Android layer type与WebView白屏-第一次加载webview很慢
    Android View框架的measure机制
    maven的facet错误解决方法
    oracle jdbc驱动发布nexus
    dubbox2.8.4编译发布到私服(nexus)
    一致性哈希 与 普通哈希对比
    1对多业务,数据库水平切分架构一次搞定 | 架构师之路
  • 原文地址:https://www.cnblogs.com/chenchengxuyuan/p/9163940.html
Copyright © 2020-2023  润新知