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
数组内存分布
图片来源: