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

返回空vector_Java集合之ArrayList的优缺点,以及和Vector的区别

ArrayList是最常见以及每个Java开发者最熟悉的集合类了,顾名思义,ArrayList就是一个以数组形式实现的集合,以一张表格来看一下ArrayList里面有哪些基本的元素:

5e2f06c924519766a542c78aa6e149e2.png

源代码:

/**  * The array buffer into which the elements of the ArrayList are stored.  * The capacity of the ArrayList is the length of this array buffer.  */  private transient Object[] elementData;  /**  * The size of the ArrayList (the number of elements it contains).  *  * @serial  */  private int size;

ArrayList类中只定义了两个私有属性,很容易理解,elementData存储ArrayList内的元素,size表示它包含的元素的数量。

有个关键字需要解释:transient

transient为java关键字,为变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的。

531090d6105206f6da8ce68d80ac695d.png

对于集合,我认为关注的点主要有四点:

1、是否允许空

2、是否允许重复数据

3、是否有序,有序的意思是读取数据的顺序和存放数据的顺序是否一致

4、是否线程安全

构造函数

ArrayList提供了三个构造函数:

ArrayList():默认构造函数,提供初始容量为10的空列表

ArrayList(int initialCapacity):构造一个具有指定初始容量的空列表。

ArrayList(Collection extends E> c):构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。

/** * 构造一个初始容量为 10 的空列表 */public ArrayList() { this(10);}/** * 构造一个具有指定初始容量的空列表。 */public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity); this.elementData = new Object[initialCapacity];}/** * 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。 */public ArrayList(Collection extends E> c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class);}
5ef6afdc4ca5624ee6d0bf5221b156ff.png

ArrayList的优缺点

1、ArrayList底层以数组实现,是一种随机访问模式,再加上它实现了RandomAccess接口,因此查找也就是get的时候非常快。

2、ArrayList在顺序添加一个元素的时候非常方便,只是往数组里面添加了一个元素而已。

不过ArrayList的缺点也十分明显:

1、删除元素的时候,涉及到一次元素复制,如果要复制的元素很多,那么就会比较耗费性能。

2、插入元素的时候,涉及到一次元素复制,如果要复制的元素很多,那么就会比较耗费性能。

因此,ArrayList比较适合顺序添加、随机访问的场景

ArrayList和Vector的区别

ArrayList是线程非安全的,这很明显,因为ArrayList中所有的方法都不是同步的,在并发下一定会出现线程安全问题。那么我们想要使用ArrayList并且让它线程安全怎么办?一个方法是用Collections.synchronizedList方法把你的ArrayList变成一个线程安全的List,比如:

List synchronizedList = Collections.synchronizedList(list);synchronizedList.add("aaa");synchronizedList.add("bbb");for (int i = 0; i < synchronizedList.size(); i++){ System.out.println(synchronizedList.get(i));}

另一个方法就是Vector,它是ArrayList的线程安全版本,其实现90%和ArrayList都完全一样,区别在于:

1、Vector是线程安全的,ArrayList是线程非安全的

2、Vector可以指定增长因子,如果该增长因子指定了,那么扩容的时候会每次新的数组大小会在原数组的大小基础上加上增长因子;如果不指定增长因子,那么就给原数组大小*2,源代码是这样的:

int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);
5ff8e07fe705c580885b0387beefae03.png

总结

ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低。

相关文章:

  • mysql 2006_MySQL 2006 超时
  • owncloud mysql版本_搭建owncloud
  • python链接mysql 语句要密码吗_python 链接 mysql数据库
  • 根据excel列动态创建mysql表_根据数据库字段动态生成excel模版下载,上传模版获取数据存入数据库(poi 反射)...
  • matlab 等高线数值显示_matlab条形图显示数值
  • springmvc mysql配置_springMVC3.2+spring3.2.4+hibernate 4.2.4+MySQL环境配置
  • win10 mysql5.7.20_Win10下MySQL5.7.20 Mysql(64位)解壓版安裝及bug修復
  • java 列出目录文件_java简单列出文件夹下所有文件的方法
  • java 代码下载excel_上传下载Excel的Demo,java代码
  • java数据类型最大值_Java 基本数据类型最大值极限和最小值极限
  • java json formatter_DataTimeFormatter 注解和 JsonFormatter注解的区别及应用
  • java 排名算法_JAVA算法之高级排序
  • java protobuf 反射_尝试在java中使用protobuf发送和接收消息,但收到错误:协议消息包含无效标记(零)...
  • java word 批注_Java 添加、回复、修改(替换)、删除Word批注
  • java自动化开发_五大Java自动化测试框架
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • express.js的介绍及使用
  • Git初体验
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • javascript 总结(常用工具类的封装)
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Promise初体验
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • TypeScript实现数据结构(一)栈,队列,链表
  • 分布式熔断降级平台aegis
  • 坑!为什么View.startAnimation不起作用?
  • 跨域
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 无服务器化是企业 IT 架构的未来吗?
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • postgresql行列转换函数
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (C++20) consteval立即函数
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (一)UDP基本编程步骤
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .gitignore文件设置了忽略但不生效
  • .naturalWidth 和naturalHeight属性,
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net 设置默认首页
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .Net的DataSet直接与SQL2005交互
  • .NET多线程执行函数
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @angular/cli项目构建--http(2)
  • @Not - Empty-Null-Blank
  • [20150707]外部表与rowid.txt
  • [BZOJ1008][HNOI2008]越狱
  • [bzoj1038][ZJOI2008]瞭望塔
  • [C#]winform部署PaddleOCRV3推理模型
  • [flask] flask的基本介绍、flask快速搭建项目并运行
  • [hive] posexplode函数
  • [JavaEE]线程的状态与安全