详解Java中Vector和ArrayList的区别

 更新时间:2016年10月22日 15:42:22   作者:川哥哥  
这篇文章主要为大家详细介绍了Java中Vector和ArrayList的区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

3个具体实现类的相关区别如下:

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

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

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

查看Java源代码,发现当数组的大小不够的时候,需要重新建立数组,然后将元素拷贝到新的数组内,ArrayList和Vector的扩展数组的大小不同。 

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);
 }
}

关于ArrayList和Vector区别如下:

ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
Vector提供indexOf(obj, start)接口,ArrayList没有。
Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Springboot获取bean实例之SpringContextUtil详解

    Springboot获取bean实例之SpringContextUtil详解

    这篇文章主要介绍了Springboot获取bean实例之SpringContextUtil使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • JAVA WSIMPORT生成WEBSERVICE客户端401认证过程图解

    JAVA WSIMPORT生成WEBSERVICE客户端401认证过程图解

    这篇文章主要介绍了JAVA WSIMPORT生成WEBSERVICE客户端401认证过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot中的Condition包下常用条件依赖注解案例介绍

    SpringBoot中的Condition包下常用条件依赖注解案例介绍

    这篇文章主要介绍了SpringBoot中的Condition包下常用条件依赖注解案例,文章基于Java的相关资料展开主题详细内容,需要的小伙伴可以参考一下
    2022-04-04
  • hadoop的wordcount实例代码

    hadoop的wordcount实例代码

    这篇文章主要介绍了hadoop的wordcount实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • springboot+vue实现阿里云oss大文件分片上传的示例代码

    springboot+vue实现阿里云oss大文件分片上传的示例代码

    阿里云推出了直传,本文主要介绍了springboot+vue实现阿里云oss大文件分片上传的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Java高并发之CyclicBarrier的用法详解

    Java高并发之CyclicBarrier的用法详解

    CyclicBarrier 是 Java 中的一种同步工具,它可以让多个线程在一个屏障点处等待,直到所有线程都到达该点后,才能继续执行。本文就来和大家聊聊它的用法,需要的可以参考一下
    2023-03-03
  • 浅谈Java中的高精度整数和高精度小数

    浅谈Java中的高精度整数和高精度小数

    本篇文章主要介绍了浅谈Java中的高精度整数和高精度小数,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java servlet后端开发超详细教程

    Java servlet后端开发超详细教程

    Servlet指在服务器端执行的一段Java代码,可以接收用户的请求和返回给用户响应结果,下面这篇文章主要给大家介绍了关于Java.servlet生命周期的相关资料,需要的朋友可以参考下
    2023-02-02
  • Java封装数组之添加元素操作实例分析

    Java封装数组之添加元素操作实例分析

    这篇文章主要介绍了Java封装数组之添加元素操作,结合实例形式分析了Java封装数组实现元素追加、插入等相关操作技巧,需要的朋友可以参考下
    2020-03-03
  • 浅谈springfox-swagger原理解析与使用过程中遇到的坑

    浅谈springfox-swagger原理解析与使用过程中遇到的坑

    本篇文章主要介绍了浅谈springfox-swagger原理解析与使用过程中遇到的坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02

最新评论