Java Vector和ArrayList的异同分析及实例讲解

作者:小妮浅浅 时间:2023-12-03 17:27:10 

在线程中有两种常用的方法,能够通过数组实现相应的功能,但除此之外在区别上也是很明显的。本篇就其中的代表方法ArrayList和Vector进行比较分析,一个是非线程安全,另一个是线程安全。在进行相同和不同点的分析之后,带来二者的实例代码对比,帮助大家体会它们的异同。

1.相同点

(1)都是有序集合。

(2)数据不允许重复。

(3)都实现了list接口。

(4)都是通过数组实现的。

(5)数组进行复制、移动、代价比较高,因此,适合随机查询和遍历,不适合插入和删除。

2.不同点

(1)ArrayList属于线程不安全(线程不同步)即当多线程进行对ArrayList集合的操作时,有可能对数据进行不正确的操作。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些。

(2)Vector是线程安全的(同步线程)即当在同一时刻只能有一个线程进行对Vector集合的操作时,但是Vector要做到线程同步,需要大量的花费,可能消耗大量的内存或者CPU。如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们再去考虑和编写线程安全的代码。

(3)ArrayList在内存不够时默认扩展1.5倍,Vector是默认扩展1倍。

(4)Vector提供indexOf(object,start)接口,ArrayList没有。

3.实例代码对比

ArrayList中:


public boolean add(E e) {
 ensureCapacity(size + 1); // 增加元素,判断是否能够容纳。不能的话就要新建数组
 elementData[size++] = e;
 return true;
public void ensureCapacity(int minCapacity) {
 modCount++;
 int oldCapacity = elementData.length;
 if (minCapacity > oldCapacity) {
   Object oldData[] = elementData; // 此行没看出来用处,不知道开发者出于什么考虑
   int newCapacity = (oldCapacity * 3)/2 + 1; // 增加新的数组的大小
   if (newCapacity < minCapacity)
   newCapacity = minCapacity;
     // minCapacity is usually close to size, so this is a win:
     elementData = Arrays.copyOf(elementData, newCapacity);
 }
}

Vector中:


private void ensureCapacityHelper(int minCapacity) {
 int oldCapacity = elementData.length;
 if (minCapacity > oldCapacity) {
   Object[] oldData = elementData;
   int newCapacity = (capacityIncrement > 0) ?
   (oldCapacity + capacityIncrement) : (oldCapacity * 2);
   if (newCapacity < minCapacity) {
   newCapacity = minCapacity;
   }
    elementData = Arrays.copyOf(elementData, newCapacity);
 }
}

Java中Vector和ArrayList的区别

首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下:

1、ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

2、Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。

3、LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。

4、vector是线程(Thread)同步(Synchronized)的,所以它也是线程安全的,而Arraylist是线程异步(ASynchronized)的,是不安全的。如果不考虑到线程的安全因素,一般用Arraylist效率比较高。

5、如果集合中的元素的数目大于目前集合数组的长度时,vector增长率为目前数组长度的100%,而arraylist增长率为目前数组长度的50%.如过在集合中使用数据量比较大的数据,用vector有一定的优势。

6、如果查找一个指定位置的数据,vector和arraylist使用的时间是相同的,都是0(1),这个时候使用vector和arraylist都可以。而
如果移动一个指定位置的数据花费的时间为0(n-i)n为总长度,这个时候就应该考虑到使用Linkedlist,因为它移动一个指定位置的数据,所花费的时间为0(1),而查询一个指定位置的数据时花费的时间为0(i)。

ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,
都允许直接序号索引元素,但是插入数据要设计到数组元素移动 等内存操作,所以索引数据快插入数据慢,
Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差
,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!

7、笼统来说:LinkedList:增删改快

ArrayList:查询快(有索引的存在)

来源:https://www.py.cn/java/jichu/23055.html

标签:Java,Vector,ArrayList,异同分析
0
投稿

猜你喜欢

  • JAVA关键字及作用详解

    2022-05-03 03:50:14
  • C# 匿名方法基础回顾

    2023-02-27 13:59:23
  • SpringBoot使用Redisson实现分布式锁(秒杀系统)

    2022-07-17 05:15:41
  • Java多线程run方法中直接调用service业务类应注意的问题及解决

    2021-12-28 19:51:46
  • c#高效的线程安全队列ConcurrentQueue<T>的实现

    2021-07-27 11:01:05
  • C#通过NPOI操作Excel的实例代码

    2022-01-20 17:26:29
  • C语言预处理器使用方法讲解

    2023-04-07 01:39:02
  • java 实现MD5加密算法的简单实例

    2023-07-19 21:53:56
  • JavaWeb页面中防止点击Backspace网页后退情况

    2023-11-10 10:36:36
  • Android Webview重定向问题解决方法

    2023-10-08 01:29:19
  • JDK源码分析之String、StringBuilder和StringBuffer

    2022-01-23 00:10:20
  • springboot实现在工具类(util)中调用注入service层方法

    2021-06-17 20:02:51
  • 浅析Android 的 MediaPlayer类

    2021-06-01 01:50:08
  • 基于动态修改App.Config与web.Config的使用详解

    2021-07-19 12:09:27
  • JAVA实现扫描线算法(超详细)

    2023-06-30 13:33:20
  • ssm mybatis如何配置多个mapper目录

    2021-12-06 14:08:25
  • intellij idea修改maven配置时总是恢复默认配置的解决方法idea版本(2020.2.x)

    2023-06-30 23:56:10
  • C语言字符串操作总结大全(超详细)

    2023-07-06 15:14:56
  • JAVA用递归实现全排列算法的示例代码

    2023-06-01 09:09:58
  • C#不提升自己程序的权限实现操作注册表

    2023-01-24 18:51:31
  • asp之家 软件编程 m.aspxhome.com