Map内存优化容器
SparseArray
-
内部使用两个数组实现
-
key只能是int值,减少拆箱装箱步骤
-
存储和读取数据时候,使用二分查找法
-
SparseArray还提供了两个特有方法,更方便数据的查询:
获取对应的key:
public int keyAt(int index)
获取对应的value:
public E valueAt(int index)
LongSparseArray
- key值为long
- 其他参考SparseArray
ArrayMap
- key值可以为任意类型,但是有装箱拆箱的内存消耗
- 其他参考SparseArray
总结One
- 如果key的为int类型,那么使用SparseArray,它避免了自动装箱的过程
- 如果key为long类型,使用LongSparseArray来确保key为long类型时的使用
- 如果key类型为其它的类型,则使用ArrayMap
- 所有的插入和删除时间复杂度均为logn
- 数据量<1000时使用
Android 线程安全容器
CopyOnWriteArrayList
- 对add、remove等操作List的方法加锁
- 对get等查值方法不加锁
- 解决多线程使用中的线程安全问题
- 使用两个数组操作,添加等加锁操作先复制一个副本操作后再赋值回去
- CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。在put时读可能读取不到。
ConcurrentHashMap
- 插入①如果哈希槽为空则用CAS插入②如果不为空对链表头加锁,然后添加
- 删除直接对链表头加锁
- 扩容也是对链表头进行加锁,会把链表头的Hash设为MOVED
HashTable
- 对所有方法基本上都加锁