文章字数:529,阅读全文大约需要2分钟
ArrayList
内部使用数组保存元素,所以查找添加和查找的速度都很快。但是达到一定的数量需要扩容,而扩容是开销很大的操作。如果需要频繁插入和删除元素,可以使用LinkedList
。
特性
线程不安全,即可以同时被多个线程操作。可能会导致数据读和写操作直接数据被篡改。可以使用
Collections.synchronizedList(List l)
获取一个线程安全的ArrayList
。或者使用juc
的CopyOnWriteArrayList
类实现了
Serializable
可以序列化初始化大小为10,当元素数量超出这个大小时会触发扩容。扩容大小为原来的1.5倍。
内部使用
private transient Object[] elementData
数组存储信息。
扩容过程
初始化创建指定大小的数组,不写默认10
插入元素时检测长度是否超出当前数组最大值
超出新建一个数组,大小为原来的1.5倍
把原数组的信息迁移到新的数组上。
数组迁移内部使用了Arrays.copyof()
,这个方法新建了一个数组并使用System.arraycopy()
方法复制信息到新数组。System.arraycopy()
是native
方法,最后使用的是c的memmove()
函数,所以效率很高
使用建议
- 能够确定存储信息数量时最好指定初始化大小,避免多次触发扩容操作。