ArrayList常用介绍

一、ArrayList概述:
可变数组:
1、ArrayList是实现了List接口的动态数组,所谓动态数组就是他的大小是可变的。
2、实现了所有可选列表操作,并允许包括Null在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。

容量可初始化:
3、每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。

可变性弊端:
4、默认初始容量是10。默认初始容量为10。随着ArrayList中元素的增加,它的容量也会不断的自动增长。
5、在每次添加元素时,ArrayList都会检查是否需要进行扩容操作,扩容操作带来数据向新数组的重新拷贝。

可变性弊端解决方法:
6、如果我们知道具体业务数据量,在构造ArrayList时,可以给ArrayList 指定一个初始容量,这样就会减少扩容时的拷贝问题。
7、当然在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。

同步问题解决:
8、ArrayList 的实现不是同步的如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。
9、为了保证同步,最好的办法是在创建时完成,以防止意外对列表进行不同步的访问:
解决方法:
List list = Collections.synchronizedList(new ArrayList(…));

使用Collections.synchronizedList创建集合:
10、从源码来看SynchronizedList 就是在 List的操作外包加了一层synchronize同步控制。
11、官方文档明确提出对于使用 Iterator遍历列表时,Collections.synchronizedList 可能发生 错误。

官方文档说明,使用迭代器遍历Collections.synchronizedList创建的集合时候,必须手动处理同步问题。
12、在涉及到迭代处理的外围,使用synchronized关键字保证线程的同步性能。
13、增强for循环的底层使用的也是迭代,因此碰到增强for循环的场景,也需要手动处理同步。

二、ArrayList常用方法:
1、底层数组
private transient Object[] elementData;
transient修饰底层数组,使得数组不会被序列化。

2、构造函数
ArrayList():默认构造函数,提供初始容量为10的空列表。
ArrayList(int initialCapacity):构造一个具有指定初始容量的空列表。
ArrayList(Collection<? extends E> c):构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。

3、新增
add(E e):将指定的元素添加到此列表的尾部。
add(int index, E element):将指定的元素插入此列表中的指定位置。
在这个方法中最根本的方法就是System.arraycopy()方法,使用比较耗时。
addAll(Collection<? extends E> c):按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。
使用System.arraycopy()处理数据的。
addAll(int index, Collection<? extends E> c):从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。
set(int index, E element):用指定的元素替代此列表中指定位置上的元素。

4、删除
remove(int index):移除此列表中指定位置上的元素。
remove(Object o):移除此列表中首次出现的指定元素(如果存在)。
removeRange(int fromIndex, int toIndex):移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。
removeAll():是继承自AbstractCollection的方法,ArrayList本身并没有提供实现。

5、查找
get(int index)用读取ArrayList中的元素

6、扩容
扩容每次扩容是1.5倍是最合适的。
使用ensureCapacity()扩容数组。
通过trimToSize()方法来将底层数组的容量调整为当前列表保存的实际元素的大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值