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方法。


相关文章
|
6月前
|
存储 Java Android开发
Android轻量级数据SparseArray详解
Android轻量级数据SparseArray详解
50 0
|
Android开发
Android SparseArray与ArrayMap
公共类数据Constant.java /** * 常量类 * @author mazaiting * @date 2018/2/7 */ public class Constant { public static final int ...
1142 0
|
Android开发
Android利用SparseArray替换使用HashMap&lt;Integer,E&gt;
MainActivity如下: package cc.testsparsearray; import java.util.HashMap; import java.
1028 0
|
6天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
11天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
13天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
15天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
13天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
14天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
25 2
|
15天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!