基本介绍
- ArrayList: 基于数组实现的顺序表,大小可以动态增加,集合元素可以为任意对象类型,基本使用如下
//初始化ArrayList
ArrayList<String> arrayList = new ArrayList<>();
//添加元素
arrayList.add("list1");
arrayList.add("list2");
//取出某个位置的元素
arrayList.get(1);
- LinkedList: 基于链表实现的list集合,集合元素可以为任意对象类型,基本使用如下
//初始化LinkedList
LinkedList linkedList = new LinkedList<>();
//添加元素
linkedList.add("list1");
linkedList.add("list2");
//取出某个位置的元素
linkedList.get(1);
- HashMap: 基于数组和链表实现的数据结构,存储的内容是键值对,键和值的类型均可为任意对象类型,基本使用如下
//初始化HashMap
HashMap<String,String> hashMap = new HashMap<>();
//添加键值对
hashMap.put("key1","value1");
hashMap.put("key2","value2");
//获取某个键对应的值
hashMap.get("key1");
- SparseArray: 基于数组实现的数据结构,存储的内容是键值对,但键只能为int类型,值可以为任意对象类型,在android中一般用SparseArray来替代HashMap以优化内存提升性能,基本使用如下
//初始化
SparseArray<String> sparseArray = new SparseArray<>();
//添加元素
sparseArray.put(1,"value1");
sparseArray.put(2,"value2");
//获取某个键对应的值
sparseArray.get(1);
对比
名称 | 实现基础 | 存储方案 | 优点 | 缺点 |
---|---|---|---|---|
数组 | 一片物理上连续的大小确定的储存空间 | 查找快 | 增删慢,大小确定 | |
ArrayList | 数组 | 1.物理上连续 2.逻辑上连续 3.大小可以动态增加 | 查找快 | 增加和删除要移动大量元素,所以增删慢 |
LinkedList | 链表 | 1.物理上不连续 2.逻辑上连续 3.可以动态增加和删除 | 增删快 | 查找要轮询,所以查找慢 |
HashMap | 数组+链表 | 1.物理上部分连续,部分不连续 2.逻辑上连续 3.可以动态增加 | 查询、新增、删除性能都不错 | 内存使用较多 |
SparseArray | 数组 | 双数组 | 在HashMap基础上做的优化,查询、新增、删除性能都不错,并且内存使用比HashMap少得多 | 键的类型必须为int型 |
原理
- SparseArray
- 增加:根据key值进行二分查找,找到可以添加元素的位置,然后插入数据,并移动其他数据
- 查找:根据key值进行二分查找,找到数组下标,取出对应value值
- 删除:先计算key的hash值(装箱拆箱),根据hash值找到数组位置,再从链表中删除节点