e.get/put过程:元素会按照key从小到大进行存储,先使用二分法查询key对应在数组中的下标index,然后通过该index进行增删查。源码分析见SparseArray解析
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
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”, 1);
reference.set(user1);
User user2 = new User(“b”,2);
User user = reference.getAndSet(user2);
System.out.println(user);
//输出
User{userName=‘a’, age=1} System.out.println(reference.get());
//输出
User{userName=‘b’, age=2}}static class User { private String userName;
private int age; public User(String userName, int age) { this.userName = userName; this.age = age;
} @Override public String toString() {
return “User{” +“userName='” + userName + ‘’’ +“, age=” + age + ‘}’;
}
}
}
原子更新字段:
-
AtomicIntegeFieldUpdater:原子更新整型字段
-
AtomicLongFieldUpdater:原子更新长整型字段
-
AtomicStampedReference:原子更新带有版本号的引用类型
使用方法:由于原子更新字段类是抽象类,因此需要先通过其静态方法newUpdater创建一个更新器,并设置想更新的类和属性
注意:被更新的属性必须用public volatile修饰
//这几个类提供的方法基本一致,以AtomicIntegeFieldUpdater为例
public class AtomicDemo {
private static AtomicIntegerFieldUpdater updater = AtomicIntegerFieldUpdater.newUpdater(User.class,“age”);
public static void main(String[] args) { User user = new User(“a”, 1);
int oldValue = updater.getAndAdd(user, 5);
System.out.println(oldValue);
//输出1
System.out.println(updater.get(user));
//输出6
}static class User { private String userName;
public volatile int age;
public User(String userName, int age) {
this.userName = userName;
this.age = age;
} @Override public String toString() { return “User{” +“userName='” + userName + ‘’’ +“, age=” + age +‘}’;
}
}
}
c.优点:
可以避免多线程的优先级倒置和死锁情况的发生,提升在高并发处理下的性能,相比于synchronized ,在非激烈竞争的情况下,开销更小,速度更快
3. Android埋点
**a.含义:**预先在目标应用采集数据,对特定用户行为或事件进行捕获、处理,并以一定方式上报至服务器,便于后续进行数据分析
b.方式
代码埋点:在某个事件发生时通过预先写好的代码来发送数据
-
优点:控制精准,采集灵活性强,可自由选择何时发送自定义数据
-
缺点:开发、测试成本高,需要等发版才能修改线上埋点、更新代价大
无埋点/全埋点:在端上自动采集并上报尽可能多的数据,在计算时筛选出可用的数据
-
优点:很大程度上减少开发、测试的重复劳动,数据可回溯且覆盖全面
-
缺点:采集信息不够灵活,数据量大,后端筛选分析工作量大
可视化埋点:通过可视化工具选择需要收集的埋点数据,下发配置给客户端,终端点击时获取当前点击的控件根据配置文件进行选择上报
-
优点:很大程度上减少开发、测试的重复劳动,数据量可控且相对精确,可在线上动态埋点、而无需等待App发版
-
缺点:采集信息不够灵活,无法解决数据回溯的问题
几个实践:51信用卡(https://mp.weixin.qq.com/s/svzwQkAy0favp0Ty3NtoLA)、网易(https://mp.weixin.qq.com/s/0dHKu5QIBL_4S7Tum-qW2Q)、58同城(https://mp.weixin.qq.com/s/rP7PiN7lsnUxcY1BAhB_5Q)
4.Java基础之注解(Annotation)
**a.含义:**是附加在代码中的一些元数据,在JDK1.5 版本开始引入,与类、接口、枚举在同一个层次
b.作用:
声明在包、类、字段、方法、局部变量、方法参数等前面,用来对这些元素进行说明和注释
注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用,比如编译时进行格式检查、简化操作进而降低代码量
c.使用
以下代码展示了注解的定义、属性和使用的方法:
//1.注解的定义:
通过@interface关键字//以下表示创建了一个名为TestAnnotation的注解public @interface TestAnnotation {
//2.注解的属性:
//声明:采用“无形参的方法”形式,方法名表示属性名,返回值表示属性类型
资源分享
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2020年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!