汇总:Android小白成长之路_知识体系汇总【持续更新中…】
- 集合框架
- ArrayList
- linkedList
- HashMap
- HashSet
-Set和List区别:
- Set接口实例存储的是无序、不重复的数据,List存放的是有序、可以重复的数据
- Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变
- List和数组类似,可以动态增长,查找元素效率高,插入删除效率低,会引起元素位置改变
- 只有Vector和HashTable是线程安全的,其他都是非线程安全的
- ArrayList类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制
- ArrayList
中的元素实际上都是对象,因此无法直接把E类型变量写为基本数据类型,而应该使用它们的包装类 - ArrayList是线程不安全的,建议在单线程中使用
- ArrayList的默认大小是10,当容量不足时,会扩容,新的容量 = (原来容量*3)/2+1
- linkedList是一种双向循环链表,且头结点不存放数据
- linkedList是线程不安全的,建议阿紫单线程中使用
- linkedList支持从头遍历和从尾遍历,因此它的get方法做了优化,如果索引小于size/2,则从头遍历,否则从尾遍历
- linkedList做插入、删除的时候,慢在寻址,快在只需要改变前后Entry的引用地址,ArrayList做插入、删除的时候,慢在数组元素的批量copy,快在寻址,所以,如果待插入、删除的元素是在数据结构的前半段尤其是非常靠前的位置的时候,linkedList的效率将大大快过ArrayList,但越是往后,ArrayList由于要批量copy的元素越来越少,操作速度必然追上乃至超过linkedList。不过一般情况下都是linkedList更快,毕竟ArrayList如果触发了扩容也是耗时操作
- 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是基于HashMap来实现的,是一个不允许重复元素的集合
- HashSet也允许有null值
- HashSet实现了Set接口, 仅存储对象,value值默认为Object对象
- HashSet是线程不安全的
仅存储对象,value值默认为Object对象 - HashSet是线程不安全的



