汇总:Android小白成长之路_知识体系汇总【持续更新中…】
集合框架
Set
和List
区别:Set
接口实例存储的是无序、不重复的数据,List
存放的是有序、可以重复的数据Set
检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变List
和数组类似,可以动态增长,查找元素效率高,插入删除效率低,会引起元素位置改变
- 只有
Vector
、Stack
和HashTable
是线程安全的,其他都是非线程安全的
ArrayList
ArrayList
类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制ArrayList<E>
中的元素实际上都是对象,因此无法直接把E类型变量写为基本数据类型,而应该使用它们的包装类ArrayList
是线程不安全的,建议在单线程中使用ArrayList
的默认大小是10
,当容量不足时,会扩容,新的容量 = (原来容量*3)/2+1
LinkedList
LinkedList
是一种双向循环链表,且头结点不存放数据LinkedList
是线程不安全的,建议在单线程中使用LinkedList
支持从头遍历和从尾遍历,因此它的get方法做了优化,如果索引小于size/2
,则从头遍历,否则从尾遍历LinkedList
做插入、删除的时候,慢在寻址,快在只需要改变前后Entry
的引用地址,ArrayList
做插入、删除的时候,慢在数组元素的批量copy
,快在寻址,所以,如果待插入、删除的元素是在数据结构的前半段尤其是非常靠前的位置的时候,LinkedList
的效率将大大快过ArrayList
,但越是往后,ArrayList
由于要批量copy
的元素越来越少,操作速度必然追上乃至超过LinkedList
。不过一般情况下都是LinkedList
更快,毕竟ArrayList
如果触发了扩容也是耗时操作
HashMap
HashMap
由数组+链表
组成,jdk1.8以后,当链表长度达到8
,便会使用红黑树
HashMap.put(key,value)
过程:- 获取
key
字符串的hashcode
值 - 经过
HashMap
中的hash
函数,使得hash
值更散列 - 根据
hash
值确定存储的位置,若该位置没有元素,则直接插入,否则迭代该处元素链表并依次比较其key
的hash
值,如果两个hash
值相等,则用新的value
覆盖掉原来的,如果不等,则将该节点插入链表的表头,如果超过了8
,则转为插入红黑树
- 获取
HashMap
的初始容量大小默认为16
,当存储的元素个数超过容量乘以加载因子(默认0.75
)的结果值,就会将数组容量变为原来的两倍,这个过程称为扩容,扩容时会生成一个新的数组,原来的所有数据将重新计算hash
值重新分配到新数组中,非常耗时,因此创建hashMap
时预设元素的个数能够有效地提高性能HashMap
允许key
为null
的形式存取,会将其放到第一个位置中,在存储时会对其做特殊处理HashMap
是线程不安全的,需要线程安全时可用使用HashTable
- 重写对象的
equals
方法时,通常要同时重写它的hashcode
方法,保证其返回相同的值,就是为了防止两个对象equals
返回true
,却由于hashcode
不同,从而在HashMap
中存放了两个对象
HashSet
HashSet
是基于HashMap
来实现的,是一个不允许重复元素的集合HashSet
也允许有null
值HashSet
实现了Set
接口, 仅存储对象,value
值默认为Object
对象HashSet
是线程不安全的
仅存储对象,value
值默认为Object
对象HashSet
是线程不安全的