0%

ArrayList原理

文章字数:529,阅读全文大约需要2分钟

ArrayList内部使用数组保存元素,所以查找添加和查找的速度都很快。但是达到一定的数量需要扩容,而扩容是开销很大的操作。如果需要频繁插入和删除元素,可以使用LinkedList

特性

  1. 线程不安全,即可以同时被多个线程操作。可能会导致数据读和写操作直接数据被篡改。可以使用Collections.synchronizedList(List l)获取一个线程安全的ArrayList。或者使用jucCopyOnWriteArrayList

  2. 实现了Serializable可以序列化

  3. 初始化大小为10,当元素数量超出这个大小时会触发扩容。扩容大小为原来的1.5倍。

  4. 内部使用private transient Object[] elementData数组存储信息。

扩容过程

  1. 初始化创建指定大小的数组,不写默认10

  2. 插入元素时检测长度是否超出当前数组最大值

  3. 超出新建一个数组,大小为原来的1.5倍

  4. 把原数组的信息迁移到新的数组上。
    数组迁移内部使用了Arrays.copyof(),这个方法新建了一个数组并使用System.arraycopy()方法复制信息到新数组。
    System.arraycopy()native方法,最后使用的是c的memmove()函数,所以效率很高

使用建议

  1. 能够确定存储信息数量时最好指定初始化大小,避免多次触发扩容操作。