作者:厘米姑娘
博客:https://www.jianshu.com/p/af49a6899559
以下是本文的知识清单:
SparseArray
atomic包
Android埋点
Java基础之注解
一点小感悟
1. SparseArray
当新建一个key为整型的HashMap时,会出现如下的提示信息,推荐使用SparseArray来替代HashMap:
接下来就来介绍下SparseArray:
a.数据结构:又称稀疏数组,内部通过两个数组分别存储key和value,并用压缩的方式来存储数据
b.优点:可替代key为int、value为Object的HashMap,相比于HashMap
能更节省存储空间
由于key指定为int,能节省int和Integer的装箱拆箱操作带来的性能消耗
扩容时只需要数组拷贝工作,而不需重建哈希表
c.适用场景:数据量不大(千以内)、空间比时间重要、需要使用Map且key为整型;不适合存储大容量数据,此时性能将退化至少50%
d.使用
添加:public void put(int key, E value)
删除:
public void delete(int key)
public void remove(int key)实际上内部会调用delete方法
查找:
public E get(int key)
public E get(int key, E valueIfKeyNotFound)可设置假设key不存在时默认返回的value
public int keyAt(int index)获取相应的key
public E valueAt(int index)获取相应的value
e.get/put过程:元素会按照key从小到大进行存储,先使用二分法查询key对应在数组中的下标index,然后通过该index进行增删查。源码分析见SparseArray解析(https://www.jianshu.com/p/30a2bfb202b4)
2. atomic包
a.原子操作类:与采取悲观锁策略的synchronized不同,atomic包采用乐观锁策略去原子更新数据,并使用CAS技术具体实现
//保证自增线程安全的两种方式
public class Sample {
private static Integer count = 0;
synchronized public static void increment {
count++;
}
}
public class Sample {
private static AtomicInteger count = new AtomicInteger(0);
public static void increment {
count.getAndIncrement;
}
}
基础知识:Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS(https://www.cnblogs.com/qjjazry/p/6581568.html)
b.类型
原子更新基本类型:
AtomicInteger:原子更新Integer
AtomicLong:原子更新Long
AtomicBoolean:原子更新boolean
以AtomicInteger为例,常用方法:
getAndAdd(int delta):取当前值,再和delta值相加
addAndGet(int delta) :先和delta值相加,再取相加后的最终值
getAndIncrement:取当前 值,再自增
incrementAndGet :先自增,再取自增后的最终值
getAndSet(int newValue):取当前值,再设置为newValue值
原子更新数组:
AtomicIntegerArray:原子更新整型数组中的元素
AtomicLongArray:原子更新长整型数组中的元素
AtomicReferenceArray:原子更新引用类型数组中的元素
以AtomicIntegerArray为例,常用方法:
addAndGet(int i, int delta):先将数组中索引为i的元素与delta值相加,再取相加后的最终值
getAndIncrement(int i):取数组中索引为i的元素的值,再自增
compareAndSet(int i, int expect, int update):如果数组中索引为i的元素的值和expect值相等,则更新为update值
原子更新引用类型:
AtomicReference:原子更新引用类型
AtomicReferenceFieldUpdater:原子更新引用类型里的字段
AtomicMarkableReference:原子更新带有标记位的引用类型
//这几个类提供的方法基本一致,以AtomicReference为例
public class AtomicDemo {
private static AtomicReference reference = new AtomicReference<>;
public static void main(String[] args) {
User user1 = new User("a