Android中常用的数据结构

interface Collection<E> // 集,一组数据
|--> interface Set<E> // 集合,不允许重复元素
|    |--> interface SortedSet<E> // 对元素进行排序
|    |    |--> interface NavigableSet<E> // 可获得离指定元素最近的元素
|    |    |    |--> class TreeSet<E> // 使用TreeMap<E, Object>实现,非线程安全
|    |    |    |--> class ConcurrentSkipListSet<E> // 使用ConcurrentSkipListMap实现,线程安全
|    |
|    |--> class HashSet<E> // 使用HashMap<E, Object>实现,非线程安全
|    |    |--> class LinkedHashSet<E> // 维护元素的添加顺序,使用LinkedHashMap<E, Object>实现,非线程安全
|    |
|    |--> class CopyOnWriteArraySet<E> // 使用CopyOnWriteArrayList实现,线程安全
|    |--> class ArraySet<E> // Android类,内存优化(相比于HashSet),不保证线程安全
|
|
|--> interface List<E> // 序列,可以控制元素的插入位置,通过序号访问元素,以及查找元素
|    |--> class ArrayList<E> // 使用可变数组(resizable-array)实现,非线程安全
|    |--> class LinkedList<E> // 使用双向链表(doubly-linked list)实现,非线程安全
|    |--> class CopyOnWriteArrayList<E> // 类似ArrayList,线程安全
|    |--> class Vector<E> // 类似ArrayList,线程安全
|    |    |--> class Stack<E> // LIFO
|
|
|--> interface Queue<E> // 队列,FIFO(典型而非必须),不支持对元素进行索引访问
|    |--> interface BlockingQueue<E> // 阻塞队列,线程安全
|    |    |--> class ArrayBlockingQueue<E> // 基于数组的定长阻塞队列
|    |    |--> class LinkedBlockingQueue<E> // 基于链表的定长或不定长阻塞队列
|    |    |--> class PriorityBlockingQueue<E> // 基于堆(heap)的不定长阻塞队列
|    |    |--> class SynchronousQueue<E> // 不存储元素的阻塞队列
|    |    |--> class DelayQueue<E extends Delayed> // 无界的延迟元素阻塞队列
|    |    |
|    |    |--> interface BlockingDeque<E> // 双端阻塞队列
|    |    |    |--> class LinkedBlockingDeque<E> // 基于链表的定长或不定长双端阻塞队列
|    |    |
|    |    |--> interface TransferQueue<E> // 生产者等待消费者接收元素
|    |    |    |--> class LinkedTransferQueue<E> // 基于链表的无界传输队列
|    |
|    |--> class PriorityQueue<E> // 优先队列,元素保持优先级排列,基于堆(heap)实现,非线程安全
|    |--> class ConcurrentLinkedQueue<E> // 基于链表的无界队列,线程安全
|    |
|    |--> interface Deque<E> // 双端队列(double ended queue),可用作队列或栈
|    |    |--> class ArrayDeque<E> // 基于数组的双端队列,非线程安全
|    |    |--> class LinkedList<E> // 基于链表的双端队列,非线程安全
|    |    |--> class ConcurrentLinkedDeque<E> // 基于链表的无界双端队列,线程安全
|    |    |--> interface BlockingDeque<E>

interface Map<K, V> // 映射,不允许重复键值,一个键值对应最多一个数据
|--> interface SortedMap<K, V> // 键全排序
|    |--> interface NavigableMap<K,V> // 导航方法返回离给定查找目标最近的匹配
|    |    |--> class TreeMap<K, V> // 使用红黑树实现,非线程安全
|    |    |--> interface ConcurrentNavigableMap<K,V>
|
|--> class HashMap<K, V> // 基于散列表(hash table,数组+链表)实现,非线程安全
|    |--> class LinkedHashMap<K, V> // 使用散列表和链表实现,维持一个双向链表来记录键值对的插入顺序,非线程安全
|
|--> interface ConcurrentMap<K,V> // 原子性保证,线程安全
|    |--> class ConcurrentHashMap<K,V> // 类似HashTable
|    |--> interface ConcurrentNavigableMap<K,V> // 子映射可导航
|    |    |--> class ConcurrentSkipListMap<K,V> // 基于跳跃列表实现
|
|--> class EnumMap<K extends Enum<K>, V> // 使用双数组实现,其中键是枚举型,非线程安全
|--> class IdentityHashMap<K,V> // 使用散列表(数组)实现,比较键以及值时使用引用比较代替值比较,非线程安全
|--> class WeakHashMap<K,V> // 使用散列表实现,其中键是弱引用,非线程安全
|
|--> class Hashtable<K, V> // 类似HashMap,线程安全
|--> class ArrayMap<K, V> // Android类,内存优化(相比于HashMap)

class Collections // 作用于或返回集的工具类
class Arrays // 作用于或返回数组的工具类

class LruCache<K, V> // Android类,使用LinkedHashMap<K, V>实现,线程安全
class SparseArray<E> // Android类,使用双数组实现,将整型映射至对象

简介:

  1. Collection
    boolean add(E e):确保该集包含指定元素,当该集发生变化时返回true
    boolean remove(Object o):从该集移除指定元素的一个实例,当该集包含指定元素时返回true
    boolean addAll(Collection<? extends E> c):添加指定集的所有元素至该集,当该集发生变化时返回true
    boolean removeAll(Collection<?> c):从该集移除全部存在于指定集的元素,当该集发生变化时返回true
    boolean retainAll(Collection<?> c):在该集中仅保留存在于指定集的元素,当该集发生变化时返回true
  2. Set
    boolean equals(Object o):当指定物件同样是个集合,两个集合大小一致,且该集合包含指定集合的每一个成员时返回true。该定义确保此方法适用于集合的不同实现。Overrides: equals in interface Collection
  3. SortedSet
    获取子集指的是得到子集的视图,对子集的修改会反映到该集,反之亦然。
    SortedSet<E> subSet(E fromElement, E toElement):获取子集[fromElement, toElement)
    SortedSet<E> headSet(E toElement):获取严格小于toElement的子集
    SortedSet<E> tailSet(E fromElement):获取大于等于fromElement的子集
    E first():获取当前最小的元素
    E last():获取当前最大的元素
  4. NavigableSet
    E lower(E e):获取小于e的最大元素,没有则为空
    E floor(E e):获取小于等于e的最大元素,没有则为空
    E ceiling(E e):获取大于等于e的最小元素,没有则为空
    E higher(E e):获取大于e的最小元素,没有则为空
    E pollFirst():获得最小元素并移除
    E pollLast():获得最大元素并移除
  5. List
    boolean equals(Object o):当且仅当指定物件同样是个序列,两个序列大小一致,且两个序列的所有对应元素也相等时返回true。换句话说,当两个序列有相同顺序的相同元素时定义为相等。该定义确保此方法适用于序列的不同实现。Overrides: equals in interface Collection
    E set(int index, E element):替代指定位置元素并返回旧元素
    E remove(int index):移除指定位置元素并返回旧元素
    List<E> subList(int fromIndex, int toIndex):获取子序列[fromIndextoIndex),这里得到的是子序列的视图,对子序列的非结构性修改会反映到该序列,反之亦然。
  6. ArrayList
    【集合详解】ArrayList源码解读之动态扩容-CSDN博客
  7. Vector
    boolean removeElement(Object obj):从该向量中移除参数的首次出现,功能上等同于remove(Object)
  8. Stack
    E peek():获取栈顶元素
    int search(Object o):返回离栈顶最近的相同元素至栈顶的距离,栈顶元素距离为1
  9. Queue
    boolean add(E e):如果可以立即往该队列里插入指定元素且不违反容量限制则返回true,若当前没有可用空间则抛出异常。Overrides: add in interface Collection
    boolean offer(E e):同add,如果元素能加入队列则返回true,否则返回false
    E remove():检索并移除队列头部,当队列为空时抛出异常。
    E poll():同remove,当队列为空时返回null
    E element():检索队列头部但并不移除,当队列为空时抛出异常。
    E peek():同element,当队列为空时返回null
  10. BlockingQueue
    void put(E e):往该队列插入指定元素,必要时等待空间变得可用。
    boolean offer(E e, long timeout, TimeUnit unit):同put,最多等待指定时间。
    E take():检索并移除队列头部,必要时等待直到有元素变得可用。
    E poll(long timeout, TimeUnit unit):同take,最多等待指定时间。
    int remainingCapacity():返回该队列在无需阻塞下能理想接收的额外的元素数目。
    int drainTo(Collection<? super E> c):从该队列移除所有可用元素并添加至给定集,返回传输元素的数目。
    BlockingQueue(阻塞队列)详解 - CSDN博客
    java并发学习之BlockingQueue实现生产者消费者 - CSDN博客
Throws exceptionSpecial valueBlocksTimes out
Insertadd(e)offer(e)put(e)offer(e, time, unit)
Removeremove()poll()take()poll(time, unit)
Examineelement()peek()不适用不适用
  1. PriorityQueue
    深入理解Java PriorityQueue - CarpenterLee - 博客园

  2. Deque
    void push(E e):往双端队列表现的栈推入元素,等价于addFirst
    E pop():从双端队列表现的栈推出元素,等价于removeFirst

  3. Map
    V put(K key, V value):将指定值联系至指定键,返回键联系的先前的值或null
    V remove(Object key):移除键对应的键值对,返回键联系的先前的值或null
    Set<K> keySet():返回所有键的集合视图。
    Collection<V> values():返回所有值的集视图。
    Set<Map.Entry<K, V>> entrySet():返回所有键值对的集合视图。
    boolean equals(Object o):当给定物件也是一个映射且两个映射包含相同键值对时返回true,该定义确保此方法适用于映射的不同实现。

  4. SortedMap
    以下方法的功能与SortedSet相应的方法类似:

SortedMap<K,V> subMap(K fromKey, K toKey);
SortedMap<K,V> headMap(K toKey);
SortedMap<K,V> tailMap(K fromKey);
K firstKey();
K lastKey();
  1. NavigableMap
    Map.Entry<K,V> lowerEntry(K key):返回严格小于给定键的最大键对应的键值对,当没有这样的键时返回null
    K lowerKey(K key):返回严格小于给定键的最大键,当没有这样的键时返回null
    NavigableSet<K> navigableKeySet():返回所有键的可导航集合视图。
  2. TreeMap
    Java提高篇(二七)-----TreeMap - chenssy的博客 - CSDN博客
  3. HashMap
    Java8系列之重新认识HashMap - ImportNew
    (编者注:原文扩容机制中,key = 3、7、5,put顺序依次为 5、7、3有误,顺序应为3、7、5。)
  4. ConcurrentHashMap
    ConcurrentHashMap演进从Java7到Java8 | 技术世界
  5. EnumMap
    java集合(四)Map集合之EnumMap详解 - 跃小云 - 博客园
  6. HashTable
    boolean contains(Object value):等价于boolean containsValue(Object value)
  7. LruCache
    彻底解析Android缓存机制——LruCache - 简书
  8. SparseArray
    SparseArray 的使用及实现原理 - 掘金
    类似的还有:
mapkeyvalue
SparseArrayintObject
SparseBooleanArrayintboolean
SparseIntArrayintint
SparseLongArrayintlong
LongSparseArraylongObject

比较:

  1. ArrayList & ArrayBlockingQueue & ArrayDeque
    三者都是基于数组来实现,ArrayList在数组中间index位置插入和删除元素时,index后的元素都要通过System.arraycopy来搬动,而ArrayBlockingQueue通过takeIndexputIndex两个标志位来标记定长数组的实际队首和队尾,而且当标志位到达数组末尾时会返回到数组头部,ArrayDeque也是通过headtail来标记队首和队尾,这里head指头部元素的序号,tail指可以添加下一个元素到尾部的序号,即最后一个元素的下一个序号。
  2. LinkedList & LinkedBlockingQueue & LinkedBlockingDeque
    两者都是基于链表来实现,LinkedListLinkedBlockingDeque的头节点或尾节点如果非空,则该节点的元素非空,而LinkedBlockingQueue的头节点非空且节点的元素为空,也就是第二个节点才真正装载第一个元素,尾节点非空并装载最后一个元素,当尾节点和头节点是同一个节点时,尾节点的元素也可以是空。
  3. ArrayList & PriorityQueue
    ArrayList进行排序之后,所有元素是全排序的。而PriorityQueue的优先级排序并非是全排序,仅仅是符合小根堆的结构,即父节点小于子节点,所以每次获取到的头节点都是权值最小的。
  4. VectorCopyOnWriteArrayList
    Vector与CopyOnWriteArrayList简单比较分析
  5. ArraySet & ArrayMap
    Android内存优化-----使用ArrayMap/ArraySet代替HashMap/HashSet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值