| 底层结构 | 版本 | 线程安全(同步效率) | 扩容倍数 | |
|---|---|---|---|---|
| ArrayList | 可变数组 | jdk1.2 | 不安全,查询效率高、增删效率低 | 有参构造1.5倍数;如果是无参第一次10,第二次1.5倍 |
| Vector | 可变数组 | jdk1.0 | 安全,效率不高 | 无参,默认10,满后按2倍扩容,指定大小,则每次按2倍扩容 |
| linkedList | 双向链表 | jdk1.2 | 不安全,增删效率高、查询效率低 | 无需扩容 |
-
Hashset
1. 实现set接口
- 实际上是HashMap(数组+链表+红黑树)
- 可以放null,但是只能放一个(元素不能重复)
- 不保证元素有序,取决于hash后,再决定索引值
-
实现原理
- HashSet底层是HashMap
- 添加元素时,先得到hash值,会转成索引值
- 找到数组,看这个索引位置是否有值
- 如果没有值直接加入;如果有值,调用equals方法比较(一个节点、红黑树、链表),如果相同,放弃添加,不同,则添加到最后
- 添加完后,判断,在java8中,链表的个数8(含),数组64(含),链表进行红黑树化
- 数组的扩充。默认16,是16*0.75就开始认为提前扩充,扩充为原来的2倍
-
应用
- 加入学生类,将姓名和年龄相同的认为同一个放入HashSet中保存



