当前位置: 首页 > news >正文

Java中Vector和ArrayList的区别

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

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

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

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

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

ArrayList中:

复制代码

1 public boolean add(E e) {
2
3    ensureCapacity(size + 1);  // 增加元素,判断是否能够容纳。不能的话就要新建数组
4  
5    elementData[size++] = e;
6
7    return true;
8
9 }
10
11  public void ensureCapacity(int minCapacity) {
12
13    modCount++;
14
15    int oldCapacity = elementData.length;
16
17    if (minCapacity > oldCapacity) {
18
19        Object oldData[] = elementData; // 此行没看出来用处,不知道开发者出于什么考虑
20  
21        int newCapacity = (oldCapacity * 3)/2 + 1; // 增加新的数组的大小
22  
23        if (newCapacity < minCapacity)
24
25       newCapacity = minCapacity;
26
27            // minCapacity is usually close to size, so this is a win:
28  
29            elementData = Arrays.copyOf(elementData, newCapacity);
30
31    }
32
33 }
34
35  

复制代码

 

 

Vector中:

复制代码

1 private void ensureCapacityHelper(int minCapacity) {
2
3    int oldCapacity = elementData.length;
4
5    if (minCapacity > oldCapacity) {
6
7        Object[] oldData = elementData;
8
9        int newCapacity = (capacityIncrement > 0) ?
10
11       (oldCapacity + capacityIncrement) : (oldCapacity * 2);
12
13        if (newCapacity < minCapacity) {
14
15       newCapacity = minCapacity;
16
17        }
18
19         elementData = Arrays.copyOf(elementData, newCapacity);
20
21    }
22
23 }
24
25

复制代码

 

关于ArrayList和Vector区别如下:

  1. ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。

  2. Vector提供indexOf(obj, start)接口,ArrayList没有。

  3. Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。


转载于:https://my.oschina.net/u/1861837/blog/335320

相关文章:

  • 如何培养数据分析的能力?
  • zabbix根据主机和端口列表自动发现监控远程MongoDB实例
  • [转载]浅析海量用户的分布式系统设计
  • heroku 部署nodejs+mongodb
  • 仿QQ大战—服务器的搭建(ServerSocket)
  • Android : com.mobeta.android.dslv.DragSortListView-引用自定义控件包名错误
  • MySQL配置文件my.cnf优化详解
  • Exchange Server 各版本比较
  • linux bash 和 sh的区别
  • yum安装 lnmp
  • javascript中array常用属性方法
  • 免费下载:用于原型设计的 iOS 7 线框图
  • linux命令(24):/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc
  • oracle怎么创建一个表空间
  • jQuery Ajax使用总结
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《剑指offer》分解让复杂问题更简单
  • Java程序员幽默爆笑锦集
  • leetcode388. Longest Absolute File Path
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 创建一种深思熟虑的文化
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 用Canvas画一棵二叉树
  • 优秀架构师必须掌握的架构思维
  • 智能合约开发环境搭建及Hello World合约
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • #Linux(权限管理)
  • #pragma 指令
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (poj1.2.1)1970(筛选法模拟)
  • (SpringBoot)第二章:Spring创建和使用
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)jQuery 基础
  • (转)visual stdio 书签功能介绍
  • .NET CLR基本术语
  • .Net MVC + EF搭建学生管理系统
  • .net 托管代码与非托管代码
  • ::什么意思
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • []指针
  • [20150629]简单的加密连接.txt
  • [51nod1610]路径计数
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [C++参考]拷贝构造函数的参数必须是引用类型
  • [dts]Device Tree机制
  • [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
  • [LeetCode]—Simplify Path 简化路径表达式
  • [New Portal]Windows Azure Virtual Machine (3) 在VM上挂载磁盘