Java集合框架底层实现 --源码

版权声明:该博客为博主原创,转载请标明出处! https://blog.csdn.net/DJH2717/article/details/81608264

List:


  • ArrayList 数组实现
    /**
     * Default initial capacity.
     */
    private static final int DEFAULT_CAPACITY = 10;

    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * will be expanded to DEFAULT_CAPACITY when the first element is added.
     */
    transient Object[] elementData; 

    /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param  initialCapacity  the initial capacity of the list
     * @throws IllegalArgumentException if the specified initial capacity
     *         is negative
     */
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
  • ArrayList 在扩容的时候是采用的 copy 方法:
    /**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

  • LinkedList 双向链表
// This is node object.
private static class Node<E> {
            E item;
            LinkedList.Node<E> next;
            LinkedList.Node<E> prev;

            Node(LinkedList.Node<E> prev, E element, LinkedList.Node<E> next) {
                this.item = element;
                this.next = next;
                this.prev = prev;
            }
        }

Set:

  • HashSet 由 HashMap 实现:
    /**
     * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }

  • TreeSet 由 TreeMap 实现:
    /**
     * The backing map.
     */
    private transient NavigableMap<E,Object> m;
    
    /**
     * Constructs a set backed by the specified navigable map.
     */
    TreeSet(NavigableMap<E,Object> m) {
        this.m = m;
    }

  • LinkedHashSet 由 HashSet 实现:
public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

   public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }
}

Queue:

  • queue接口不包括并发容器的话常用的实现有 LinkedList 和 ArrayDqueue, 具体的实现结构分别是链表和数组.

Map:

static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next; // 注意此处的 next 引用

        ....省略其他无关代码

 }

  • TreeMap 由链表实现的 二叉排序树实现.

  • LinkedHashMap 继承自 HashMap, 由 HashMap 实现
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

猜你喜欢

转载自blog.csdn.net/DJH2717/article/details/81608264