集合主要是两组(单列集合(Conllection) , 双列集合(Map))
一.Conllection集合
Collection 接口有两个重要的子接口 List和Set , 他们的实现子类都是单列集合
1. List(有序,可重复)
遍历方式:
- 可以使用迭代器
- 增强for循环
- 能使用索引方式获取
(1)Arraylist:
- 默认初始容量为10
- 线程不安全,查询速度快
- 底层数据结构是数组
- 扩容增量:原容量的 0.5倍
- 改查效率高,增删效率低
- 可以添加任意元素(可重复),包括null
如 ArrayList的容量为10,一次扩容后是容量为15
(2)Vector:
- 默认初始容量为10
- 线程安全,但速度慢
- 底层数据结构是数组
- 加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容
- 扩容增量:原容量的 1倍
- 改查效率高,增删效率低
- 可以添加任意元素(可重复),包括null
如 Vector的容量为10,一次扩容后是容量为20
(3)LinkedList:
- 改查效率低,增删效率高
- 线程不安全,没有实现同步
- 底层数据结构时双向链表
- 可以添加任意元素(可重复),包括null
2. Set(有些有序,有些无序,不重复)
遍历方式:
- 可以使用迭代器
- 增强for循环
- 不能使用索引方式获取
(1)TreeSet(有序不重复):
- 底层是红黑树
- TreeSet中存储的类型必须是一致的,不能一下存int,一下又存string
- 可以排序,两种方式 1.自然排序(元素具备比较性) 让元素所属的类实现Comparable接口 。2.比较器排序(集合具备比较性) 让集合接收一个Comparator的实现类对象
(2)HashSet(无序不重复):
- 可以存放null值,但只能一个
- 底层数据结构是数组+链表+红黑树。哈希表依赖两个方法:hashCode()和equals()
- 线程不安全,存取速度快
- 底层实现是一个HashMap(保存数据)
- 默认初始容量为16
- 加载因子为0.75:即当元素个数超过容量长度的0.75倍 时,进行扩容
- 扩容增量:原容量的 1 倍
- 当一条链表上的元素到达8个,并且table到达64时,会进行红黑树转换
如 HashSet的容量为16,一次扩容后是容量为32
(3)LinkedHashSet(有序不重复):
- 底层是双向链表和哈希表
- 底层实现是LinkedHashMap
二.Map集合
Map 接口的实现子类 是双列集合,存放的 K-V
1. TreeMap(有序的):
- 底层是红黑树,自然平衡二叉树
- 可以排序,两种方式 1.自然排序(元素具备比较性) 让元素所属的类实现Comparable接口 。2.比较器排序(集合具备比较性) 让集合接收一个Comparator的实现类对象
2. HashMap(无序的):
- key不能重复,value可以重复,允许使用null
- 底层数据结构是数组+链表+红黑树。哈希表依赖两个方法:hashCode()和equals()
- 线程不安全,存取速度快
- 默认初始容量为16
- 加载因子为0.75:即当元素个数超过容量长度的0.75倍 时,进行扩容
- 扩容增量:原容量的 1 倍
- 当一条链表上的元素到达8个,并且table到达64时,会进行红黑树转换
如 HashSet的容量为16,一次扩容后是容量为32
3. Hashtable(无序的):
- key和value都不允许null值
- 线程安全,效率较低
- 底层使用Entry数组保存元素
- 默认初始容量是11
- 加载因子是0.75:即当元素个数超过容量长度的0.75倍 时,进行扩容
- 扩容增量:原容量的 1 倍加1
如 Hashtable的容量为11,一次扩容后是容量为23