1 数据的物理结构

1.1 顺序结构

定义:数据中的元素放在一段连续的内存空间中,大小固定且不支持动态扩容,典型代表就是数组。
特点:随机访问方便,插入删除复杂

1.2 链式结构

定义:数据被存储在内存的不同地方,它们的物理位置之间完全没有关系。链式结构由多个节点组成,每个节点中包括有效数据和至少一个指针变量。
特点: 随机访问不方便,插入删除方便。由于链表不要求连续的空间,所以链表不存在扩容问题,但是链表占用的内存空间要大于数组,因为要维护前后指针。

2 集合的数据结构

2.1 ArrayList

物理结构:顺序结构
逻辑结构:数组

ArrayList的存储结构:

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0];
transient Object[] elementData;

可知ArrayList是初始为Object[] 的数组。

2.2 LinkedList

物理结构:链式结构
逻辑结构: 节点元素Node包含有效数据和前后两个指针,双向链表。

LinkedList的存储结构:

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;
        }
    }

2.3 HashMap

物理结构:顺序结构+链式结构(链表元素超过8个后,变为红黑树)
逻辑结构: 底层是一个数组,数组中的每一项是一个链表。

HashMap的存储结构:

static class Node<K, V> implements Entry<K, V> {
        final int hash;
        final K key;
        V value;
        HashMap.Node<K, V> next;

        Node(int hash, K key, V value, HashMap.Node<K, V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }
        //........省略无关代码
        }

2.4 HashSet

物理结构:顺序结构+链式结构
逻辑结构: 一种特殊的Hashmap(Node对象中value始终为空对象)。

HashSet的存储结构:

private transient HashMap<E, Object> map;
    private static final Object PRESENT = new Object();

2.5 HashTable

物理结构:顺序结构+链式结构
逻辑结构: 同HashMap,只不过在put方法中增加synchronize以保证线程安全性,但是效率会比较慢。

HashTable的存储结构:

private static class Entry<K, V> implements java.util.Map.Entry<K, V> {
        final int hash;
        final K key;
        V value;
        Hashtable.Entry<K, V> next;

        protected Entry(int hash, K key, V value, Hashtable.Entry<K, V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }
        //
        }

2.6 ConcurrentHashMap

物理结构:顺序结构+链式结构(链表元素超过8个后,变为红黑树)
逻辑结构: 分段锁

ConcurrentHashMap的存储结构后面会专门讲解

2.7 LinkedHashMap

物理结构:顺序结构+链式结构
逻辑结构:HashMap+双向链表

2.8 TreeMap

物理结构:链式结构
逻辑结构: 红黑树,相对于hashmap,key是有序的。

TreeMap的存储结构:

static final class Entry<K, V> implements java.util.Map.Entry<K, V> {
        K key;
        V value;
        TreeMap.Entry<K, V> left;
        TreeMap.Entry<K, V> right;
        TreeMap.Entry<K, V> parent;
        boolean color = true;

        Entry(K key, V value, TreeMap.Entry<K, V> parent) {
            this.key = key;
            this.value = value;
            this.parent = parent;
        }
        //无关代码.......
        }

2.9 TreeSet

物理结构:链式结构
逻辑结构: 借助于TreeMap存储

TreeSet的存储结构同TreeMap

数组内存分布

图片来源:

Java 实现DAG数据结构 java数据结构详解_逻辑结构