Android15之SparseArray、HashMap、Map用法实例(二百三十八)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者
新书发布:《Android系统多媒体进阶实战》🚀
优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2. SparseArray、HashMap、Map介绍
- 🐓2.1 SparseArray
- 🐓2.2 HashMap
- 🐓2.3 Map
- 🐓2.4 使用场景对比
- 🌻3. 代码实例
- 🐓3.1 Android标准SparseArray获取Key索引值V1.0
- 🐓3.2 Android标准SparseArray获取Key索引值V2.0
🌻1.前言
本篇目的:Android15之SparseArray、HashMap、Map用法实例
🌻2. SparseArray、HashMap、Map介绍
🐓2.1 SparseArray
适用范围:Android SDK 提供的特定数据结构,通常用于 int 键和任意对象值的映射。
设计初衷:优化内存使用,适用于键值分布稀疏的场景。与 HashMap 相比,它的实现没有使用装箱(boxing)机制,避免了 Integer 对象的自动装箱带来的开销。
性能特点:在 Android 上内存效率高,适用于存储 int -> Object 的映射,不适合高频增删操作。
- 使用示例
import android.util.SparseArray;SparseArray<String> sparseArray = new SparseArray<>();
sparseArray.put(1, "Value1");
sparseArray.put(2, "Value2");String value = sparseArray.get(1); // 获取键为1的值
sparseArray.remove(2); // 移除键为2的项
🐓2.2 HashMap
适用范围:Java 标准库中的数据结构,适用于任意类型键和值的映射。
设计初衷:通用的键值对映射,不局限于特定的键类型,灵活性高。
性能特点:通过哈希表实现,增删查改效率较高,适合键值对数目较多的情况;但由于需要装箱,使用 Integer 类型作为键时会有额外的内存开销。
- 使用示例
import java.util.HashMap;HashMap<Integer, String> hashMap = new HashMap<>();
hashMap.put(1, "Value1");
hashMap.put(2, "Value2");String value = hashMap.get(1); // 获取键为1的值
hashMap.remove(2); // 移除键为2的项
🐓2.3 Map
适用范围:Java 集合框架中的通用接口,定义了键值对存储的基本操作;HashMap、TreeMap、LinkedHashMap 等类都实现了 Map 接口。
设计初衷:提供统一的键值映射接口,便于在不同类型的映射数据结构中切换。
性能特点:Map 本身不是一个具体的数据结构类,性能取决于实现类。常用的实现类有:
HashMap:基于哈希表,适合快速查找。
TreeMap:基于红黑树,键有序。
LinkedHashMap:维护插入顺序,适合用于缓存实现。
- 使用示例
import java.util.Map;
import java.util.HashMap;Map<Integer, String> map = new HashMap<>();
map.put(1, "Value1");
map.put(2, "Value2");String value = map.get(1); // 获取键为1的值
map.remove(2); // 移除键为2的项
🐓2.4 使用场景对比
🌻3. 代码实例
🐓3.1 Android标准SparseArray获取Key索引值V1.0
public void getKeyIndex() {int MUSIC = 1, NAVIGATION = 2, VOICE_COMMAND = 3, CALL_RING = 200, CALL = 5, ALARM = 6, NOTIFICATION = 7, SYSTEM_SOUND = 8;// 创建音频上下文的整数值列表List<Integer> CONTEXTS = new ArrayList<>(Arrays.asList(MUSIC, NAVIGATION, VOICE_COMMAND, CALL_RING, CALL, ALARM, NOTIFICATION, SYSTEM_SOUND));// 初始化 SparseArray 并添加每个音频上下文的键值对SparseArray<String> CONTEXT_NAMES = new SparseArray<>(CONTEXTS.size());CONTEXT_NAMES.append(MUSIC, "MUSIC");CONTEXT_NAMES.append(NAVIGATION, "NAVIGATION");CONTEXT_NAMES.append(VOICE_COMMAND, "VOICE_COMMAND");CONTEXT_NAMES.append(CALL_RING, "CALL_RING");CONTEXT_NAMES.append(CALL, "CALL");CONTEXT_NAMES.append(ALARM, "ALARM");CONTEXT_NAMES.append(NOTIFICATION, "NOTIFICATION");CONTEXT_NAMES.append(SYSTEM_SOUND, "SYSTEM_SOUND");// 循环遍历 SparseArray 的所有键并获取索引for (int i = 0; i < CONTEXT_NAMES.size(); i++) {int key = CONTEXT_NAMES.keyAt(i); // 获取当前键int index = CONTEXT_NAMES.indexOfKey(key); // 获取当前键的索引String name = CONTEXT_NAMES.get(key); // 获取键对应的值// 打印日志信息Log.e(new Exception().getStackTrace()[0].getFileName(),"xxx----> "+new Exception().getStackTrace()[0].getMethodName()+"() , line = "+new Exception().getStackTrace()[0].getLineNumber()+ " key = " + key+ " index = " + index+ " name = " + name);}}
🐓3.2 Android标准SparseArray获取Key索引值V2.0
public void getKeyIndices() {// 使用 Object[][] 数组来存储整数键和字符串值Object[][] contextData = {{1, "MUSIC"},{2, "NAVIGATION"},{3, "VOICE_COMMAND"},{200, "CALL_RING"},{5, "CALL"},{6, "ALARM"},{7, "NOTIFICATION"},{8, "SYSTEM_SOUND"}};// 初始化 Map 并使用循环将键值对添加到 Map 中Map<Integer, String> audioContextMap = new HashMap<>();for (Object[] entry : contextData) {int key = (int) entry[0]; // 将第一个元素转换为 intString value = (String) entry[1]; // 将第二个元素转换为 StringaudioContextMap.put(key, value); //将key和Value使用map存放.}// 初始化SparseArray 并使用 Map 中的键值对填充SparseArray<String> CONTEXT_NAMES = new SparseArray<>(audioContextMap.size());for (Map.Entry<Integer, String> entry : audioContextMap.entrySet()) {CONTEXT_NAMES.append(entry.getKey(), entry.getValue());}// 循环遍历 SparseArray 的所有键并获取索引for (int i = 0; i < CONTEXT_NAMES.size(); i++) {int key = CONTEXT_NAMES.keyAt(i); // 获取当前键int index = CONTEXT_NAMES.indexOfKey(key); // 获取当前键的索引String name = CONTEXT_NAMES.get(key); // 获取键对应的值// 打印日志信息Log.e(new Exception().getStackTrace()[0].getFileName(),"xxx------> "+new Exception().getStackTrace()[0].getMethodName()+"() , line = "+new Exception().getStackTrace()[0].getLineNumber()+ " key = " + key+ " index = " + index+ " name = " + name);}}