android 获取元素的下标_卧底发自腾讯一线的真实Android资料

6d9321891ae6b57d82c23d2195f3f16d.gif

作者:厘米姑娘

博客:https://www.jianshu.com/p/af49a6899559

以下是本文的知识清单:

  • SparseArray

  • atomic包

  • Android埋点

  • Java基础之注解

  • 一点小感悟

1. SparseArray

当新建一个key为整型的HashMap时,会出现如下的提示信息,推荐使用SparseArray来替代HashMap:

8122d6f9dd145694e7c645da7c2feed1.png

接下来就来介绍下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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值