Java开发中如何选择集合实现类个人总结
第一步:判断数据的类型(单列数据(k)(用Collection)还是双列数据(k-v)(用Map))
单列数据(k)Collection的实现类选择:
- 数据允许重复存储(List)
1.1. 增加和删除元素的行为多:选择LinkedList实现类(双向链表式,增加和删除节点速度快)
1.2. 改动和查找元素的行为多:选择ArrayList实现类(可变数组式,有索引,查找和修改的速度快),开始为0,然后存入数据时,默认扩容10,然后当存储不够了满了后,再扩容前面的1.5倍,
1.3. 选择线程安全的:选择Vector实现类,和ArrayList实现类用法相似 - 数据不允许重复存储 (Set)
2.1. 无序存储(添加元素顺序和取出元素顺序不一致):选择HashSet(底层是HashMap, 其存储结构为节点数组+单向链表/红黑树),16个大小Node,但是有一个加载因子0.75,具有临界值(threshold)16*0.75=12,当数组存储的元素到达12个节点时,就会自动扩容table数组为原来的2倍,临界值也会跟着扩容2倍。链表的元素超过8个且table节点数组的大小>=64个,这条链表就会进行树化,
2.2. 自动排序存储(根据想要的key值的类型进行排序存储):选择TreeSet(底层是有参构造器可以写入一个匿名内部类比较器参数实现排序)
2.3. 添加元素顺序和取出元素顺序一致:选择LinkedHashSet(底层是一个节点数组+双向链表,每个节点根据添加顺序进行前驱后继绑定)
双列数据(k-v)Map的实现类选择:
- key无序存储:选择HashMap(存储结构为节点数组+单向链表/红黑树),16个大小Node,但是有一个加载因子0.75,具有临界值(threshold)16*0.75=12,当数组存储的元素到达12个节点时,就会自动扩容table数组为原来的2倍,临界值也会跟着扩容2倍。
- key有序存储:选择TreeMap (底层是有参构造器可以写入一个匿名内部类比较器参数实现排序)
- 添加元素顺序和取出元素顺序一致:选择LinkedHashMap(底层是一个节点数组+双向链表,每个节点根据添加顺序进行前驱后继绑定)
- 读取配置文件数据:选择Properties(不允许有null值)