Arraylist、LinkedList、HashMap、SparseArray(Android独有)

1、Arraylist与LinkedList相比,区别在于Arraylist查找数据更快,而LinkedList插入数据更快

Arraylist查找数据采用的方式跟数组相似,而访问数组查找数据的方式是最快的,原因是因为数组查找数据的时候采用的是通过地址查找的方式来查找,并且在内存地址中是连续的内存,只需要通过内存地址加上所需要查找的字节就能快速的获取该内存地址的数据。
LinkedList查找数据是通过for循环来进行查找的。
Arraylist插入数据采取的方式是ArrayCopy的形式,例如当数据有10条,我们要插入一条数据到下标5的位置,那么数据的处理方式就是将原来下标5到9的数据全部往后移动一位,再将数据插入到下标5,这样就导致了性能的损耗。删除数据也是如此。
LinkedList采用的是链表的方式,即插入数据的时候,只要将插入的数据与前后两个数据进行链式绑定就可以了,因此LinkedList插入数据会更快。
当然,如果是在Arraylist的末尾加减数据,那么是不会照成性能损耗的。

2、HashMap
HashMap采用的是键值对的方式,但是内部实际上是一个table,当我们没有规定table节点数的时候,table里面默认是16个节点,当我们自定节点数的时候,必须要是2的次方(2^n),如果我们填入的数不是2的次方,其内部也会自动增加节点转换成2的次方,所以HashMap相比是非常占内存的,因此HashMap的存储空间的初始化并不是在new的时候,而是在第一次put的时候才会开辟空间,HashMap是有一个阈值的,当存储的数据超过阈值,HashMap就会扩容,扩容是成倍扩充的,因为节点数必须是2的次方。(节点必须是2的次方的原因是因为内部算法对比Hash值的时候,转换成2进制时更有对比意义,都是11111)。
HashMap存数据的方式是在table节点上面采用链表的方式,我们通过key的hash值与table节点数取模,得到的值是多少,该数据就会存储在哪个节点,处于该节点的数据是一个链表形式的,因此当我们插入数据或者查找数据,只需要通过key的hash值找到该节点,再在该节点上的链表数据找到我们要的数据,不会照成性能的损耗。
但是HashMap最大的缺点就是占内存

3、SparseArray是Android独有的集合类
SparseArray缺点是key值只支持Integer类型
SparseArray的存储方式是key为一个数组,value为一个数组,当我们添加数据的时候,如果添加的位置是中间,那么SparseArray会采用二分查找的思想来插入数据,这样对比Arraylist大大减少了性能的消耗,而且SparseArray越用会越快,比如SparseArray的key分别是1、3、5、7、9,当key=3被删除,那么SparseArray会在该下标打上一个delete的标签,下次插入数据的时候如果在1和5之间,那么SparseArray会直接把delete标签变成新插入的数据,这样也大大减少了性能的消耗。