Android之SparseArray<E>详解

简介: Android之SparseArray<E>详解

最近编程时,发现一个针对HashMap<Integer, E>的一个提示:

1.png

翻译过来就是:用SparseArray<E>来代替会有更好性能。

那我们就来看看源码中SparseArray到底做了哪些事情:


一、构造

从构造方法我们可以看出,它和一般的List一样,可以预先设置容器大小,默认的大小是10:

  public SparseArray() {
    this(10);
  }
  public SparseArray(int initialCapacity) {
    ......
  }

二、增

它有两个方法可以添加键值对:

public void put(int key, E value)
public void append(int key, E value) 

在存储数据的时候,是采用了二分法方式,以下是它采用二分法的源码:

  private static int binarySearch(int[] a, int start, int len, int key) {
    int high = start + len;
    int low = start - 1;
    while (high - low > 1) {
      int guess = (high + low) / 2;
      if (a[guess] < key) {
        low = guess;
        continue;
      }
      high = guess;
    }
    if (high == start + len)
      return start + len ^ 0xFFFFFFFF;
    if (a[high] == key) {
      return high;
    }
    return high ^ 0xFFFFFFFF;
  }

所以,它存储的数值都是按键值从小到大的顺序排列好的。

三、查

它有两个方法可以取值:


public E get(int key)

public E get(int key, E valueIfKeyNotFound)


最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值


查看第几个位置的键:


public int keyAt(int index)

查看第几个位置的值:


public E valueAt(int index)


查看键所在位置,由于采用二分法查找键的位置,所以没有的话返回小于0的数值,而不是返回-1,这点要注意,返回的负数其实是表示它在哪个位置就找不到了,如果你存了5个,查找的键大于5个值的话,返回就是-6:


public int indexOfKey(int key)


查看值所在位置,没有的话返回-1:


public int indexOfValue(E value)


四、删

它有四个方法:


public void delete(int key)

public void remove(int key)


但其实,delete和remove的效果是一样的,remove方法中调用了delete方法,remove源码:

public void remove(int key) {

 delete(key);

}

public void removeAt(int index)

public void clear()


最后一个就是清除全部


五、改

public void setValueAt(int index, E value)

public void put(int key, E value)

put方法还可以修改键值对,注意:如果键不存在,就会变为添加新键值对

六、其他:

SparseArray实现了Cloneable接口,还可以调用clone方法。


相关文章
|
存储 Java Android开发
Android轻量级数据SparseArray详解
Android轻量级数据SparseArray详解
121 0
|
Android开发
Android SparseArray与ArrayMap
公共类数据Constant.java /** * 常量类 * @author mazaiting * @date 2018/2/7 */ public class Constant { public static final int ...
1191 0
|
Android开发
Android利用SparseArray替换使用HashMap&lt;Integer,E&gt;
MainActivity如下: package cc.testsparsearray; import java.util.HashMap; import java.
1078 0
|
6天前
|
开发工具 Android开发
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
95 11
X Android SDK file not found: adb.安卓开发常见问题-Android SDK 缺少 `adb`(Android Debug Bridge)-优雅草卓伊凡
|
16天前
|
Java 开发工具 Maven
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
69 6
|
2月前
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
163 11
|
2月前
|
移动开发 Java 编译器
Kotlin与Jetpack Compose:Android开发生态的演进与架构思考
本文从资深Android工程师视角深入分析Kotlin与Jetpack Compose在Android系统中的技术定位。Kotlin通过空安全、协程等特性解决了Java在移动开发中的痛点,成为Android官方首选语言。Jetpack Compose则引入声明式UI范式,通过重组机制实现高效UI更新。两者结合不仅提升开发效率,更为跨平台战略和现代架构模式提供技术基础,代表了Android开发生态的根本性演进。
101 0
|
6月前
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
1292 77
|
3月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
180 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
7月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
448 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex

热门文章

最新文章