Java中的Vector和ArrayList区别及比较

Vector  和  ArrayList 比较

有时用Vector更好一点,有时用ArrayList更好一点,不能准确容易的给出答案,因为要视具体情况而定,有四个主要考虑的因素:

1:API
2: 同步(synchronization)
3:数据增长(Data  growth)
4:使用模式(Usage  pattern)

下面分别意义探讨:

1:API

在Ken Arnold, James Gosling, and David Holmes 的 Java 程序语言的描述中,Vector和ArrayList是类比设计的,从API 的角度来看,两个类有很多相似性,但是两个类也有一些不同。

2:同步(Synchronization)

从同步性的角度考虑 :  Vector是同步的,一些访问Vector的内容的方法是线程安全的,而ArrayList是非同步的,访问ArrayList的内容的方法是线程不安全的,因为有这个不同,使用synchronized关键字修饰的,将会在性能上有所下降,因此如果你不需要一个线程安全的集合,使用ArrayList。不用花费不必要的synchronization性能开销。

3:数据增长(Data   growth)

从内部的数据结构来看,ArrayList 和 Vector都是使用  数组(Array)的模式存放内容,你需要在程序设计中小心这个本质,当在 ArrayList和 Vector中插入数据时,如果ArrayList或 Vector的对象存储超出了对应的空间(即内部数组长度)。对应的ArrayList或 Vector将会扩充它们的内部的数组。 Vector默认扩充内部数组的一倍,就是相当于两个以前的数组的大小,而ArrayList仅仅增加50%的大小,根据你使用哪个类来确定增加一个元素的性能影响,最好的方式就是设置对象的初始化容量为需要的最大容量,这样能够避免以后插入元素后的自增长,(自增长会涉及到数组内部元素的复制到新创建的数组中),如果你不知道数据将增长到多大,但是你知道数据增长的速率,Vectory能够拥有轻微的优势,因为你能够设置增长的值。

至于为什么要把 Vector设置为同步和自增长为自身大小的一倍而ArrayList设置为非同步自增长为自身大小的一半:

八卦一下:设置为同步说明数据增长比较激烈,就是增长速率和频率较大,如果设置为一半,很快数组又满了,所以设置为一倍。

而ArrayList相应的 增长速率慢,设置为不同步,不容易出现多线程并发问题。
八卦只是个人理解,欢迎拍砖。

4:使用模式(usage pattern)

ArrayList和Vector都是比较好的在检索特定位置 的元素的时候以及在集合的末尾增加和移除元素,所有以上的操作都是在O(1)的线性时间,但是如果增加和移除一些别的位置的元素(非最末尾位置)需要更昂贵的线性时间开销为O(n-i),n代表了元素的总个数,i代表了插入或移除的索引位置,这些操作代价更大,因为不得不移动索引i后端所有的元素,这意味着什么呢?

这意味着你先查找到索引为以及 i 以后 的元素,然后在数组的末尾插入和移除该元素。如果你想做插入或删除,可以考虑一些别的集合类,例如:LinkedList能够增加或移除一些位置的元素在常量时间O(1)内,但是索引元素的位置比较慢,需要O(i)的时间开销,i 是需要的元素的索引,遍历ArrayList是很容易的,因为你能够简单的使用索引代替创建一个迭代器,LinkedList也为每一个插入的元素创建一个内部的对象,因此你必须意识到额外的垃圾被创建。

最后声明:你能够使用最普通的数组来代替Vector或者ArrayList,尤其是因为标准代码的性能,使用数组能够避免同步(synchronization),额外的方法调用,最适度的调整大小,你仅仅需要花费额外的开发时间。通过array能够为您的程序量身定做需要的集合。

(0)

相关推荐

  • 浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别

    就ArrayList与Vector主要从二方面来说.一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 就HashMap与HashTable主要从三方面来说.一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现 二.同步性:Hashtable是线程安全的,也就是说是同步的,

  • 浅谈 java中ArrayList、Vector、LinkedList的区别联系

    以前面试的时候经常会碰到这样的问题.,叫你写一下ArrayList.LinkedList.Vector三者之间的区别与联系:原先一直搞不明白,不知道这三者之间到底有什么区别?哎,惭愧,基础太差啊,木有办法啊委屈 现在得去说说这三者之间的区别与联系了:这三者都是实现了List接口,都拥有List接口里面定义的方法,并且同时拥有Collection接口的方法: ArrayList:采用的是数组的方式进行存储数据的,查询和修改速度快,但是增加和删除速度慢:线程是不同步 LinkedList:采用的是链

  • vector,map,list,queue的区别详细解析

    1.vector  (连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间岁间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大空间,然后拷贝的性能开销. 2.deque (小片的连续,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是可以使用[],只是速度没有vector快)快速的访问随机的元素,快速的在开始和末尾插入元素,随机的插入,删除元素要慢,空间的重新分配要比vector快,重新分配空间后,原有的元素

  • Java中Vector与ArrayList的区别详解

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体实现类的相关区别如下:1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中.当从ArrayList的中间位置插入或者删除元素时,需要对数组

  • java ArrayList和Vector的区别详解

     ArrayList和Vector的区别 相同点: 1.ArrayList和Vector都是继承了相同的父类和实现了相同的接口 2.底层都是数组实现的 3.初始默认长度都为10. 不同点: 1.同步性: Vector中的public方法多数添加了synchronized关键字,以确保方法同步,也即是Vector线程安全,ArrayList线程不安全. 2.扩容不同 内部属性不同,这可能是导致扩容方式不同的原因所在. ArrayList有两个属性,存储数据的数组elementData,和存储记录数

  • Java 中的vector和list的区别和使用实例详解

    要了解vector,list,deque.我们先来了解一下STL. STL是Standard Template Library的简称,中文名是标准模板库.从根本上说,STL是一些容器和算法的集合.STL可分为容器(containers).迭代器(iterators).空间配置器(allocator).配接器(adapters).算法(algorithms).仿函数(functors)六个部分.指针被封装成迭代器,这里vector,list就是所谓的容器. 我们常常在实现链表,栈,队列或者数组时,

  • 详解Java中Vector和ArrayList的区别

    首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复. 3个具体实现类的相关区别如下: 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中.当从ArrayList的中间位置插入或者删除元素时,需要对

  • Java中的Vector和ArrayList区别及比较

    Vector  和  ArrayList 比较 有时用Vector更好一点,有时用ArrayList更好一点,不能准确容易的给出答案,因为要视具体情况而定,有四个主要考虑的因素: 1:API 2: 同步(synchronization) 3:数据增长(Data  growth) 4:使用模式(Usage  pattern) 下面分别意义探讨: 1:API 在Ken Arnold, James Gosling, and David Holmes 的 Java 程序语言的描述中,Vector和Arr

  • 浅谈Java中Collection和Collections的区别

    1.java.util.Collection 是一个集合接口.它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体的实现.Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set 2.java.util.Collections 是一个包装类.它包含有各种有关集合操作的静态多态方法.此类不能实例化,就像一

  • 详解Java中的Vector

    Vector实现了AbstractList抽象类和List接口,和ArrayList一样是基于Array存储的 Vector 是线程安全的,在大多数方法上存在synchronized关键字 //Vector存放的元素,初始化默认长度为10 protected Object[] elementData; //元素个数 protected int elementCount; //每次扩容大小,默认为0 protected int capacityIncrement; //构造函数,无指定初始化大小和

  • Java中为何要使用ArrayList

    前言 当我们用于获取一组数据的时候,我们总是通过下面的格式定义变量. private List<Tag> tags = new ArrayList<>(); 我们熟悉的数组去哪了? 回顾数组 我们学习c语言,c++,会学到数组是存储同类型的一组数据.后来学习指针,知道了两种结构,链式结构与顺序结构.再后来学习数据结构.知道了两种结构的优缺点. 链式结构方便删除,添加. 顺序结构方便查找. 但是我们在实际使用中逐渐感受到数组在使用上的缺点.不仅仅是在定义时就要规定数组大小. 我们通过

  • 浅析java中Pair和Map的区别

    在这篇文章中,我们讨论了一个非常有用的编程概念,配对(Pair).配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用. 在核心Java库中可以使用配对(Pair)的实现.除此之外,某些第三方库,比如Apache Commons和Vavr,已经在各自的api中公开了这个功能. 核心java配对实现 Pair类 Pair类在javafx.util 包中,类构造函数有两个参数,键及对应值: Pair<Integer, String> pair = new Pair<

  • Java 中泛型 T 和 ? 的区别详解

    目录 泛型中 T 类型变量 和 ? 通配符 区别 Generic Types 类型变量 用法 2.声明通用的方法 – 泛型方法: 有界类型参数 Wildcards 通配符 1.上界通配符:? extend 上界类型 2.无界通配符:? 3.下界通配符:? super 子类 类型擦除 泛型中 T 类型变量 和 ? 通配符 区别 定义不同 :T 是类型变量,? 是通配符 使用范围不同: ? 通配符用作 参数类型.字段类型.局部变量类型,有时作为返回类型(但请避免这样做) T 用作 声明类的类型参数.

  • Java中for与foreach的区别

    目录 (1)遍历元素 (2)删除元素 (3)修改元素 (4)foreach修改元素属性 总结 之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说了一下是否能删除,以及原因:接下来我们来探讨一下是否能够如此: (1)遍历元素 首先,我们一一段代码为例:         String[] array = {"1", "2", "3"};         for (String i : array) {

  • 详谈Java中instanceof和isInstance的区别

    一次性搞定instanceof和isInstance,instanceof和isInstance长的非常像,用法也很类似,先看看这两个的用法: obj.instanceof(class) 也就是说这个对象是不是这种类型, 1. 一个对象是本身类的一个对象 2. 一个对象是本身类父类(父类的父类)和接口(接口的接口)的一个对象 3. 所有对象都是Object 4. 凡是null有关的都是false  null.instanceof(class) class.inInstance(obj) 这个对象

  • Java中HashSet和HashMap的区别_动力节点Java学院整理

    什么是HashSet? HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象.如果我们没有重写这两个方法,将会使用这个方法的默认实现.. public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true. 什

随机推荐