搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小小林熬夜学编程
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
使用Python创建智能合约区块链后端服务器应用!_智能合约要调后端程序么
2
统计学习——基础概念、过拟合与正则化、分类与回归问题_统计学正则化
3
5种常用的四轴飞行器PID算法讲解集合
4
【杂谈】如何阅读编程类书籍_编程书籍阅读技巧
5
uni-app导航栏开发指南_uniapp 导航栏
6
数据结构---遍历还原二叉树_根据后序遍历结果还原二叉树 pthon
7
DM管理工具使用小技巧以及一些注意事项(包括表结构查询和事物查询)
8
【纯手撸】使用PySide6 / pyqt 搭建现代化普通B端系统图形化界面_python pyside6 做资源管理器框架界面
9
如何通过域名访问web项目_根据域名登录
10
bug 定位tag
当前位置:
article
> 正文
Android开发中高效的数据结构用SparseArray代替HashMap_比hashmap 高效
作者:小小林熬夜学编程 | 2024-06-03 07:54:19
赞
踩
比hashmap 高效
####Android开发中高效的数据结构
android开发中,在java2ee或者android中常用的
数据结构
有Map,List,Set,但android作为移动平台,有些api(很多都是效率问题)显然不够理想,本着造更好轮子的精神,android团队编写了自己的api用来代替java api
1、SimpleArrayMap<K,V>与ArrayMap<K,V>
实质上ArrayMap继承自SimpleArrayMap,主要是为了实现像HashMap一样的
api
方法,让习惯使用HashMap的开发者感觉不到差异,本质上是SimpleArrayMap+Map的再封装。
一般来说使用这2个类主要来代替HashMap,因为他们比HashMap更加高效,对内存也进行了优化。
2、SparseArray<T>与SparseArrayCompat<T>和LongSparseArray<T>
这3个类中,前2个基本上是同一类,只不过第二个类有removeAt方法,第三个是Long类型的。
这3个类也是用来代替HashMap,只不过他们的键(key)的类型是整型Integer或者Long类型,在实际开发中,如月份缩写的映射,或者进行文件缓存映射,viewHolder都特别适用
3、AtomicFile
AtomicFile首先不是用来代替File的,而是作为File的辅助类从在, AtomicFile的作用是实现事务性原子操作,即文件读写必须完整,适合多线程中的文件读写操作。
用来实现多线程中的文件读写的安全操作
----
#####用SparseArray代替HashMap
SparseArray是android提供的一个工具类,它可以用来替代hashmap进行对象的存储,其内部实现了一个矩阵压缩算法,很适合存储稀疏矩阵的。
PS:support包中还提供了兼容的类SparseArrayCompat,基本和SparseArray是同一个类,只不过第二个类有removeAt方法
针对源码的详细分析:
[http://stormzhang.com/android/2013/08/01/android-use-sparsearray-for-performance-optimization/](http://stormzhang.com/android/2013/08/01/android-use-sparsearray-for-performance-optimization/ "http://stormzhang.com/android/2013/08/01/android-use-sparsearray-for-performance-optimization/")
一、和Hashmap的对比
既然android推荐用这个东西,自然有用它的道理。其内部实现了压缩算法,可以进行矩阵压缩,大大减少了存储空间,节约内存。此外它的查找算法是二分法,提高了查找的效率。
替换原则:
1>
如果用到了: HashMap<Integer, E> hashMap = new HashMap<Integer, E>();
可以替换为:SparseArray<E> sparseArray = new SparseArray<E>();
2>
如果用到了:HashMap<Integer, Boolean> hashMap = new HashMap<Integer, Boolean>
可以替换为:SparseBooleanArray array = new SparseBooleanArray();
3>
如果用到了:HashMap<Integer, Integer> hashMap = new HashMap<Integer, Integer>
可以替换为:SparseIntArray array = new SparseIntArray();
二、用法
既然是键值对那么就有增删改查,但要记得先初始化:
Button btn = null; // 测试view,无意义
Button btn02 = null; // 测试view,表示新增的对象
final int KEY = 1;
/*
*
SparseArray指的是稀疏数组(Sparse
*
array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用
*
。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。
*/
SparseArray<View> array = new SparseArray<View>();
2.1 增加数据
/* 增加数据 */
//public void put(int key, E value) {}
array.put(KEY, btn);
//public void append(int key, E value){}
array.append(KEY, btn);
2.2 修改数据
/* 修改数据 */
//在put数据之前,会先查找要put的数据是否已经存在,如果存在就是修改,不存在就添加。
//public void put(int key, E value)
array.put(KEY, btn);
//public void setValueAt(int index, E value)
array.setValueAt(KEY, btn02);
2.3 查找数据
/* 查找数据 */
//public E get(int key)
array.get(KEY);
//public E get(int key, E valueIfKeyNotFound)
//其中get(int key)也只是调用了 get(int key,E valueIfKeyNotFound),最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值.get(int key)当找不到的时候,默认返回null。
array.get(KEY, btn); // 如果这个key找不到value,那么就返回第二个参数。和default value一样
2.4 通过位置,查找键的值
// 查看第几个位置的键:
//public int keyAt(int index)
array.keyAt(1); // 如果找不到就返回-1
2.5 通过位置,查找值
// 查看第几个位置的值:
//public E valueAt(int index)
array.valueAt(1);
// 查看值所在位置,没有的话返回-1:
//public int indexOfValue(E value)
array.indexOfValue(btn);
三、测试代码
package com.kale.pictest;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.Button;
/**
* @author:
* @description :
* @web : http://stormzhang.com/android/2013/08/01/android-use-sparsearray-for-performance-optimization/
* @date :2015年1月19日
*/
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
Log.d("TAG", "Max memory is " + maxMemory + "KB");
Button btn = null; // 测试view,无意义
Button btn02 = null; // 测试view,表示新增的对象
final int KEY = 1;
/*
*
SparseArray指的是稀疏数组(Sparse
*
array),所谓稀疏数组就是数组中大部分的内容值都未被使用(或都为零),在数组中仅有少部分的空间使用
*
。因此造成内存空间的浪费,为了节省内存空间,并且不影响数组中原有的内容值,我们可以采用一种压缩的方式来表示稀疏数组的内容。
*/
SparseArray<View> array = new SparseArray<View>();
/* 增加数据 */
//public void put(int key, E value) {}
array.put(KEY, btn);
//public void append(int key, E value){}
array.append(KEY, btn);
/* 修改数据 */
//在put数据之前,会先查找要put的数据是否已经存在,如果存在就是修改,不存在就添加。
//public void put(int key, E value)
array.put(KEY, btn);
//public void setValueAt(int index, E value)
array.setValueAt(KEY, btn02);
/* 查找数据 */
//public E get(int key)
array.get(KEY);
//public E get(int key, E valueIfKeyNotFound)
//其中get(int key)也只是调用了 get(int key,E valueIfKeyNotFound),最后一个从传参的变量名就能看出,传入的是找不到的时候返回的值.get(int key)当找不到的时候,默认返回null。
array.get(KEY, btn); // 如果这个key找不到value,那么就返回第二个参数。和default value一样
// 查看第几个位置的键:
//public int keyAt(int index)
array.keyAt(1); // 如果找不到就返回-1
// 查看第几个位置的值:
//public E valueAt(int index)
array.valueAt(1);
// 查看值所在位置,没有的话返回-1:
//public int indexOfValue(E value)
array.indexOfValue(btn);
SparseBooleanArray d;
}
}
测试代码四:
public class FragmentPagerItemAdapter extends FragmentPagerAdapter {
private final FragmentPagerItems mPages;
private final SparseArrayCompat<WeakReference<Fragment>> mHolder;
public FragmentPagerItemAdapter(FragmentManager fm, FragmentPagerItems pages) {
super(fm);
mPages = pages;
mHolder = new SparseArrayCompat<>(pages.size());
}
@Override
public int getCount() {
return mPages.size();
}
@Override
public Fragment getItem(int position) {
return getPagerItem(position).instantiate(mPages.getContext(), position);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Object item = super.instantiateItem(container, position);
if (item instanceof Fragment) {
mHolder.put(position, new WeakReference<Fragment>((Fragment) item));
}
return item;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
mHolder.remove(position);
super.destroyItem(container, position, object);
}
@Override
public CharSequence getPageTitle(int position) {
return getPagerItem(position).getTitle();
}
@Override
public float getPageWidth(int position) {
return super.getPageWidth(position);
}
public Fragment getPage(int position) {
final WeakReference<Fragment> weakRefItem = mHolder.get(position);
return (weakRefItem != null) ? weakRefItem.get() : null;
}
protected FragmentPagerItem getPagerItem(int position) {
return mPages.get(position);
}
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/666349
推荐阅读
article
【
数据结构
】
队列
的
基本操作
_给出
一个
队列
和要查找
的
数值
,
找出
数值
在
队列
中
的
位置
,
队列
位置
从1开始 要...
编写程序,实现链式、循环
队列
的
基本操作
。_给出
一个
队列
和要查找
的
数值
,
找出
数值
在
队列
中
的
位置
,
队列
位置
从1开始 要求使用...
赞
踩
article
循环
队列
的
基本操作
数据结构 C语言_
循环
队列
基本操作
实验
心得...
实验
名称:
循环
队列
的
基本操作
实验
目的:实践
循环
队列
的入队,出队,求
队列
长度
实验
内容:使typedef自定义
队列
的队头指针...
赞
踩
article
数据结构
(
C语言
)-
循环
队列
基本操作
_
数据结构
循环
队列
的
基本操作
...
文章首发于 2020-10-15 知乎文章:
数据结构
(
C语言
)-
循环
队列
基本操作
作者:落雨湿红尘(也是我o)01.
队列
介...
赞
踩
article
数据结构
循环队列的
基本操作
C语言
_
数据结构
队列的
基本操作
c++
代码...
#include
#include
#include
#define...
赞
踩
article
数据结构
—
循环
队列
(C
语言
)_
c
语言
循环
队列
...
一、头文件二、
循环
结点三、初始化四、插入五、删除六、打印七、测试代码八、主函数九、全部代码十、测试结果十一、总结一、头文...
赞
踩
article
数据结构
(C语言)
循环
队列
的
表示和实现_
c
语言写出
循环
队列
的
储存
表示,
循环
队列
储存
空间
的
初始分配量...
循环
队列
的
存储结构//----
循环
队列
----typedef stru
c
t { QElemType* base;//初始...
赞
踩
article
数据结构
(C
语言
)——循环队列的基本操作_c
语言
q
.
front
=
q
.
rear
=
0;...
数据结构
C
语言
第二版(严蔚敏),关于循环队列的入队、出队、取对头、求长度、遍历、清除等_c
语言
q
.
front
=
q
....
赞
踩
article
android
SQLite
更新
数据库
版本最佳写法_
android
studio
sqlite
更新
语...
方法是从《第一行代码》中改写过来的 onUpgrade(
SQLite
Database db,int oldVersion...
赞
踩
article
Android
Studio资源自动
清理
工具 -
Lint
Cleaner
Plugin_andro...
文章参考自:https://github.com/marcoRS/lint-cleaner-plugin
Android
项...
赞
踩
article
Android
studio
技巧
_知乎学习
android
studio
技巧
网站...
本文将通过以下几点进行举例说明:
Android
Studio 常用快捷键;
Android
Studio 强大的代码补全;...
赞
踩
article
Android
Studio
开发
环境
快速搭建(超详细)_
配置
android
开发
环境
...
Android
Studio
开发
环境
搭建 1.下载JDK、AS1.1 JDK下载1.2 AS下载1.3 百度云资源统一...
赞
踩
article
Android
Studio
集成
百度
云
推送_
android
studio
连接
百度
智能
云
...
集成
百度
云
推送照着文档跟demo分分钟是可以搞定的,主要在使用
Android
studio
的时候遇到了一些问题,主要是出...
赞
踩
article
Android
Studio
安装
教程及配置、创建第一个
Android
项目(
Windows
环境下)_a...
本人电脑:华硕win10,已经装好JDK第一步:下载
安装
包方法一:官网下载方法二:
百度网
盘链接:https://pan....
赞
踩
article
Android
studio
下载...
第一次运行
Android
Studio遇到的问题。一直点next自动安装。_android
studio
下载androi...
赞
踩
article
[
Android
]
Mac
电脑
ADB
使用_
mac
adb
使用...
在
Android
开发中,
ADB
(
Android
Debug Bridge)是一个非常重要的工具,它提供了开发者与Andr...
赞
踩
article
Android
蓝牙
设备通讯的开发(配对/
连接
/传输数据)_
android
获取
蓝牙
列表
,
连接
蓝牙
,
...
最近公司想做一个关于
蓝牙
的项目
,
同时我也学习到了很多关于
蓝牙
方面的很多知识点
,
希望在这里跟大家分享下
,
不足之处有望指明....
赞
踩
article
Android
蓝牙
开发
入门级
(
史上最全)(
1
)...
蓝牙
低功耗
(
BLE),也称为
蓝牙
4.0 或
蓝牙
Smart,是
蓝牙
技术的一个版本,专为低功耗设备设计,适用于需要长期运行...
赞
踩
article
Android
Bluetooth
蓝牙
使用详情_
startdiscovery
...
通常情况下,我们对
蓝牙
的操作主要有:开启和关闭
蓝牙
、搜索周边设备、能被周边设备所发现、获取配对设备、
蓝牙
设备间的数据传输...
赞
踩
article
Android
蓝牙
开发
(扫描
设备
、
绑定
、
解绑)
Kotlin
版(
1
),2024年
Android
开发
者...
外链图片转存中…(img-IwfxvvY7-
1
7
1
2364273428)][外链图片转存中…(img-p
1
iX
1
HKI-...
赞
踩
article
Android
蓝牙
开发
入门级
(
史上最全
)
(2)...
蓝牙
低功耗
(
BLE
)
,也称为
蓝牙
4.0 或
蓝牙
Smart,是
蓝牙
技术的一个版本,专为低功耗设备设计,适用于需要长期运行...
赞
踩
相关标签
数据结构
c++
链表
c语言
队列
C语言
p2p
算法
android
res清理
自动化清理
as
android studio
Android studio百度云推送
Unknown Error
Android Studio
学习