ArrayList动态数组
概述
ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。直接使用数组的缺点是数组一旦初始化就无法改变大小,而很多时候我们创建数组时并不知道将要往里面存多少数据,而动态数组就很好的解决了这个问题。
基本操作
ArrayList除了可以自动扩展数组外,内部还提供来了很多好用的方法,使它比普通数组强大得多,这里随便列出一些,使用时可以查看文档了解所有的方法。
add() | 将元素插入到数组最后一个元素后面或指定位置 |
addAll() | 添加集合中的所有元素到数组中 |
contains() | 判断数组是否包含某元素 |
get() | 通过索引值获取元素 |
remove() | 删除单个元素 |
subList() | 截取部分元素 |
set() | 替换指定索引的元素 |
sort() | 对元素进行排序 |
扩容机制
ArrayList的扩容机制是它被称为动态数组的原因,ArrayList默认初始容量是10,也可以在创建是指定初始容量的大小,当内部数组大小不满足元素新增需求时,就会触发扩容机制,先创建一个大小为原来1.5倍的数组,将原数组中的元素复制到新数组中,在用新数组代替原数组扩容就完成了。
应用
作为数组ArrayList天生适合随机查找,不适合随机插入或删除,因为对ArrayList进行随机插入或删除需要对数组进行复制和移动,代价比较高。如果插入或删除只在ArrayList末尾元素进行,则不需要对数组进行复制和移动,这种情况也建议使用ArrayList,而不是LinkedList,LinkedList是基于链表的,只在随机插入或删除较多的情况下有优势。另外ArrayList是不同步的,多线程下使用需做好同步。
Vector向量
Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免了多线程同时写而引起的不一致性问题,但实现线程同步需要很高的花费,因此,访问它比访问ArrayList更慢,Vector是一个遗留类,可能会被移除,已不建议使用,可以用CopyOnWriteArrayList代替。