美文网首页
java容器详解一(ArrayList)

java容器详解一(ArrayList)

作者: 半透明_ac54 | 来源:发表于2017-06-05 11:13 被阅读0次

    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)

          本文链接:https://www.haomeiwen.com/subject/whgtfxtx.html