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 item;
 LinkedList.Node next;
 LinkedList.Node prev;
 Node(LinkedList.Node prev, E element, LinkedList.Node next) {
 this.item = element;
 this.next = next;
 this.prev = prev;}
}

2.3 HashMap

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

逻辑结构: 底层是一个数组,数组中的每一项是一个链表。

HashMap的存储结构:

static class Node implements Entry {
 final int hash;
 final K key;
 V value;
 HashMap.Node next;
 Node(int hash, K key, V value, HashMap.Node next) {
 this.hash = hash;
 this.key = key;
 this.value = value;
 this.next = next;
 }
 //........省略无关代码
 }

2.4 HashSet

物理结构:顺序结构+链式结构

逻辑结构: 一种特殊的Hashmap(Node对象中value始终为空对象)。

HashSet的存储结构:

private transient HashMap map;
 private static final Object PRESENT = new Object();

2.5 HashTable

物理结构:顺序结构+链式结构

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

HashTable的存储结构:

private static class Entry implements java.util.Map.Entry {
 final int hash;
 final K key;
 V value;
 Hashtable.Entry next;
 protected Entry(int hash, K key, V value, Hashtable.Entry 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 implements java.util.Map.Entry {
 K key;
 V value;
 TreeMap.Entry left;
 TreeMap.Entry right;
 TreeMap.Entry parent;
 boolean color = true;
 Entry(K key, V value, TreeMap.Entry parent) {
 this.key = key;
 this.value = value;
 this.parent = parent;
 }
 //无关代码.......
 }

2.9 TreeSet

物理结构:链式结构

逻辑结构: 借助于TreeMap存储

TreeSet的存储结构同TreeMap

3 数组内存分布



java 集合手动释放内存 java集合的扩容机制_java 集合手动释放内存