一、java
(1)集合
1.list:LinkedList、ArrayList 和 Vector
LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
Vector 接口实现类 数组, 同步, 线程安全
2.set:HashSet 和 TreeSet
HashSet 使用哈希表存储元素,元素可以是 null
LinkedHashSet 链表维护元素的插入次序
TreeSet 底层实现为红黑树,元素排好序,元素不可以是 null
3.map:HashMap、TreeMap 和 HashTable
线程安全
HshaMap 线程不安全
TreeMap 线程不安全
HashTable 线程安全
空值
HashMap 一个 null key,多个 null value
TreeMap 不能 null key,多个 null value
HashTable 都不能有 null
继承和接口
HashMap 继承 AbstractMap,实现接口 Map
TreeMap 继承 AbstractMap,实现接口 NavigableMap(SortMap 的一种)
HashTable 继承 Dictionary,实现接口 Map
顺序
HashMap 中 key 是无序的
TreeMap 是有序的
HashTable 是无序的
构造函数
HashMap 有调优初始容量和负载因子
TreeMap 没有
HashTable 有
数据结构
HashMap 是链表+数组+红黑树
TreeMap 是红黑树
HashTable 是链表+数组
4.list、set 和 map 的区别
list:元素按进入先后有序保存,可重复
set:不可重复,并做内部排序
map:代表具有映射关系的集合,其所有的 key 是一个 Set 集合,即 key 无序且不能重复。
5.HashMap 扩容机制
数组的初始容量为 16,而容量是以 2 的次方扩充的,一是为了提高性能使用足够大的数组,
二是为了能使用位运算代替取模预算(据说提升了 5~8 倍)。
数组是否需要扩充是通过负载因子判断的,如果当前元素个数为数组容量的 0.75 时,就会
扩充数组。这个 0.75 就是默认的负载因子,可由构造器传入。我们也可以设置大于 1 的负