-
Java基础之注解
-
一点小感悟
在这里由于文字较多,小编总结了一份高阶Android技术大纲和学习资料免费分享给大家,文末有领取!
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解析
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埋点
总结
最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
技术进阶之路很漫长,一起共勉吧~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-p9UxZSPo-1714596513268)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
技术进阶之路很漫长,一起共勉吧~
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!