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

翻译过来就是:用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方法。

Android之SparseArray<E>详解相关推荐

  1. Android编程之SparseArrayE详解 Android编程之SparseArrayE详解

    Android编程之SparseArray<E>详解 分类:Android2012-09-01 13:139412人阅读评论(5)收藏举报 android编程delete存储list 最近 ...

  2. android jar 包 意见反馈功能,android重点jar包详解.docx

    android重点jar包详解 深入理解View(一):从setContentView谈起 我们都知道?MVC,在Android中,这个?V?即指View,那我们今天就来探探View的究竟.在onCr ...

  3. Android应用坐标系统全面详解

    Android应用坐标系统全面详解 原文链接:CSDN@工匠若水,http://blog.csdn.net/yanbober/article/details/50419117 1. 背景 去年有很多人 ...

  4. Android NFC开发实战详解

    Android NFC开发实战详解 Android开发实战详解NFC国内第一本AndroidNFC开发书籍带你开启AndroidNFC开发的神秘之旅大综合案例帮助读者快速进入实战角色:WiFi快速连接 ...

  5. Android Gradle 自定义Task详解二:进阶

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78523958 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  6. Android Gradle 自定义Task 详解

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 系列目录 Android Gradle使用 ...

  7. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github:  https://github.com/ReactiveX/RxJava  https://githu ...

  8. Android自定义属性,format详解

    1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name="名称"><attr name="bac ...

  9. android layout_width 属性,android:layout_weight属性详解

    在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示.android并没用提 ...

  10. 宏锦软件 Android 的 ListView 使用详解

     宏锦软件爱好者在开发Android软件时,对ListView的使用有点陌生,于是翻了许多资料,这里给大家一份比较好的教程,希望有用. 在android开发中ListView是比较常用的组件,它以 ...

最新文章

  1. 京东618单日销售超10亿,B2C网购正成主流
  2. php 自留地,重蔚自留地php基本语法-函数(附代码)
  3. Windbg调试命令详解
  4. 从零开始带你一步一步使用YOLOv3训练自己的数据
  5. 计算机基础知识教案1,计算机基础知识教案一
  6. 自然语言处理 —— 2.3 词嵌入的特性
  7. 深入.NET平台和C#编程笔记 第七章 深入理解多态
  8. 【Win32 API学习】模拟键盘输入和鼠标输入
  9. 【实践】预训练模型在华为信息流推荐中的应用与探索.pdf(附下载链接)
  10. 转:一篇很全面的freemarker教程
  11. CentOS6.5修改系统语言为英语
  12. listview 刷新某一个item
  13. python网络爬虫框架内容_Python网络爬虫-Scrapy框架
  14. ssh远程安全访问路由器
  15. c语言如何检测磁盘坏扇区,解决方案:如何检测和修复机械硬盘驱动器上的坏扇区?阅读本文后,您将知道...
  16. Android ScrollView滚动区高度和子LinearLayout的layout_marginTop的关系
  17. Android开发:如何隐藏自己的app应用
  18. Python学习笔记--Python 爬虫入门 -17-5 js 加密 (和有道词典的瓜葛)
  19. matlab设置图片的比例,Matlab 画图字体,字号的设定,图片大小和比例
  20. ChatGPT初体验——开发好帮手

热门文章

  1. NET问答: 为什么 null + true = string 呢?
  2. 【源码解读】Vue与ASP.NET Core WebAPI的集成
  3. 云原生时代 给予.NET的机会
  4. .NET 5.0正式发布,有什么功能特性(翻译)
  5. .Net 5性能改进
  6. 使用 C# sdk 连接 高可用的 rabbitmq 镜像集群
  7. 告别2019,写给2020:干好技术,要把握好时光里的每一步
  8. dotNET知音,19年归档
  9. 【开源】OSharpNS,轻量级.net core快速开发框架发布
  10. Entity Framework Core 2.1带来更好的SQL语句生成方案