java容器详解一(ArrayList)

1. 底层存储

  private transient Object[] elementData;
  private int size;

elementData 成员加上了transient关键字,该关键是在该类被序列化和反序列化的时候不参与,这是因为存放elementData是固定数组,防止没有存放元素的数组位置也被序列化,所以使用的自定义的序列化方法。
2. 构造方法
够着方法提供了两个,一个默认大小为10的数组,另一个可以指定大小的数组
3. 增加和删除
每次添加元素的时候都会检查容量是否足够,如果不够会扩容,扩容会扩大原来的1.5倍

int newCapacity = oldCapacity + (oldCapacity >> 1);

删除不进行缩容,如果数组进行一次大的扩容后,后续只使用了几个空间,可以使用

/**
     * 将底层数组的容量调整为当前实际元素的大小,来释放空间。
     */
    public void trimToSize() {
        modCount++;
       // 当前数组的容量
        int oldCapacity = elementData .length;
       // 如果当前实际元素大小 小于 当前数组的容量,则进行缩容
        if (size < oldCapacity) {
            elementData = Arrays.copyOf( elementData, size );
       }

来缩小容量
4. 总结
ArrayList内部采用固定数组来存储对象的引用,当增加到固定数组以外时,需要对数组进行扩容,新申请一块原来1.5倍大小的内存,把原来的数组拷贝的新申请的数组内。由此可得,当在频繁增加的场景中,最好一次性的申请足够大的数组容量,以免频繁扩容带来的时间开销。

你可能感兴趣的:(java容器详解一(ArrayList))