Java 数据结构

主要数据结构关系图

一图胜万言

线程安全数据结构

Vector

Stack

Hashtable

CopyOnWriteArrayList

ConcurrentHashMap

ConcurrentHashSet

BlockingQueue,ArrayBlockingQueue; LinkedBlockingQueue; PriorityBlockingQueue

AtomicInteger

线程不安全数据结构

ArrayList

LinkedList

Unsafe: 单例,final(不能继承),通过调用系统 native 函数操作底层资源 Atomic*系列和一些其他数据结构,通过 Unsafe#CAS 实现线程安全

SparseArray

  1. SparseArray 内部使用双数组,分别存储 Key 和 Value,Key 是 int[],用于查找 Value 对应的 Index,来定位数据在 Value 中的位置。
  2. 使用二分查找来定位 Key 数组中对应值的位置,所以 Key 数组是有序的。
  3. 使用数组就要面临删除数据时数据搬移的问题,所以引入了 DELETE 标记。

插入的时候为了给新数据腾位置,需要执行一个时间复杂度度为 O(n)的搬移操作,这是无法避免的 查找操作,时间复杂度可以做到 O(logn)

SparseBooleanArray、SparseLongArray、SparseIntArray 与 SparseArray 区别

ArrayMap 与 SparseArray 区别

都是通过 binarySearchHashes 查找 key

public final class ArrayMap<K, V> implements Map<K, V>
public class SparseArray<E> implements Cloneable

ArrayMap -> public V get(Object key)
ArrayMap -> public V put(K key, V value)

SparseArray -> public E get(int key)
SparseArray -> public void put(int key, E value)

实际 ArrayMap   key 也是计算完 hashcode 然后存入 int 数组的
int[] mHashes;
Object[] mArray;