美文网首页JDK源码系列
JDK源码-List系列

JDK源码-List系列

作者: 薛云龙 | 来源:发表于2017-08-23 17:22 被阅读16次

    List

    • List是一个有序的集合.使用者可以直接通过下标来获取元素.
    • List与Set不同,它允许重复元素的存在.
    • List继承与Collections,它的主要实现有ArrayList,LinkedList,Vector等等.
    • 集合在遍历的同时,进行插入删除操作会造成错误.
    ArrayList
    • List的一个实现类,同时也继承了接口RandomAccess,Cloneable, java.io.Serializable.它是具有fail-fast机制.

    • ArrayList默认的容量大小为10

    /**
         * Default initial capacity.
         */
        private static final int DEFAULT_CAPACITY = 10;
    
    • ArrayList提供了两个默认的空数据存储对象.调用无参构造器的时候,真正存储数据的elementData对象将会赋值为DEFAULTCAPACITY_EMPTY_ELEMENTDATA;调用有参的构造器时,elementData赋值为EMPTY_ELEMENTDATA.那么,为甚么要这样做?他是为了,在数据添加并且进行扩容的时候,知道当前容器扩容的大小.当elementData为DEFAULTCAPACITY_EMPTY_ELEMENTDATA时,就会自动扩容到DEFAULT_CAPACITY或者传入minCapacity(扩容大小);而当elementData为EMPTY_ELEMENTDATA时,好,这个时候elementData的大小已经是确定的了,直接根据elementData.length扩容至其1.5倍即可.
    /**
         * 在有参构造时,被调用
         */
        private static final Object[] EMPTY_ELEMENTDATA = {};
    
        /**
         * 在无参构造时,被调用
         */
        private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    
    • ArrayList对外提供的扩容方法:
    /**
         * Increases the capacity of this <tt>ArrayList</tt> instance, if
         * necessary, to ensure that it can hold at least the number of elements
         * specified by the minimum capacity argument.
         *
         * @param   minCapacity   the desired minimum capacity
         */
        public void ensureCapacity(int minCapacity) {
            int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
                // any size if not default element table
                ? 0
                // larger than default for default empty table. It's already
                // supposed to be at default size.
                : DEFAULT_CAPACITY;
    
            if (minCapacity > minExpand) {
                ensureExplicitCapacity(minCapacity);
            }
        }
    
    • ArrayList对外提供了将容器大小转为当前容器存储元素个数大小的方法.
    /**
         * Trims the capacity of this <tt>ArrayList</tt> instance to be the
         * list's current size.  An application can use this operation to minimize
         * the storage of an <tt>ArrayList</tt> instance.
         */
        public void trimToSize() {
            modCount++;
            if (size < elementData.length) {
                elementData = (size == 0)
                  ? EMPTY_ELEMENTDATA
                  : Arrays.copyOf(elementData, size);
            }
        }
    
    • ArrayList无法保证线程安全,需要使用者自己保证线程安全.
    LinkedList
    • 底层通过双向链表机制实现.
    • 插入或者删除元素时,时间复杂度为O(1);查询元素时时间复杂度为O(n);

    相关文章

      网友评论

        本文标题:JDK源码-List系列

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