Android中推荐用SparseArray替换HashMap<Integer,Object>

本文借鉴自文章Android中你还在用HashMap<Integer,Object>吗?

在Android Studio中输入以下代码:

Map<Integer,Object> map = new HashMap<>();

系统会提示:

Use new SparseArray<Object>(...) instead for better performance

推荐我们使用SparseArray&lt;Object>来取代HashMap&lt;Integer,Object>,以获取更好的性能。

SparseArray简介

SparseArrayjava.util包下的类,介绍如下:

SparseArrays map integers to Objects. Unlike a normal array of Objects, there can be gaps in the indices. It is intended to be more memory efficient than using a HashMap to map Integers to Objects, both because it avoids auto-boxing keys and its data structure doesn’t rely on an extra entry object for each mapping.

大致意思是:

SparseArrays是个整型到对象的映射,与一般的对象数组不同,它的索引值可以为空。它设计的目的是为了比HashMap<Integer,Object>拥有更高的内存性能。
主要优点有两个:

1. 它避免了对key自动装箱的操作;
2. 它的映射关系并不依赖于额外的对象;

简单提一下自动装箱:Integer i = 6; 将int基本数据类型的值包装成Integer类的对象,底层实际上调用Integer的构造函数,将int类型的值作为参数传入。

可能有人会有疑惑:为什么HashMap中的key是Integer类型而不是int类型,我们平常写入的基本上都是int类型的,这样还要自动装箱不是浪费吗?

这要从HashMap的原理来看,HashMap是通过key的hashcode值初步定位,而基本数据类型由于只能存放在栈空间中,没有对象可言,因而也没有hashCode()等方法,所以需要自动装箱成Integer类型,调用Integer类的hashCode()方法来获取hashcode值,这样不可避免地造成了性能的浪费。

这就对SparseArray提出了考验,怎样能够避免自动装箱造成的浪费同时又能够读写映射关系呢?

SparseArray的使用

我们先来对比一下SparseArray和HashMap的使用,代码如下:

//定义
SparseArray<Object> sparseArray = new SparseArray<>() ;
Map<Integer,Object> map = new HashMap<>() ;
//添加数据
sparseArray.put(1,new Object());
map.put(1,new Object()) ;
//取数据
Object o1 = sparseArray.get(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值