4.5-4.6学习总结
学习的时候,重点是代码的底层逻辑,那些方法你只需要知道它存在即可,可查询api。
集合的扩容机制比较重要,要清楚它的底层逻辑,去debug。
一.List接口
(一)特点:
- 有序,可重复
- 支持下标索引
- 每个元素都有相应的下标记录位置,据此存取元素
(二)实现类
常用的ArrayList,LinkedList,Vector
(三)遍历
除了能有Collection的遍历方式外,还可以下标索引遍历
(1)ArrayList
特点
- 可加入null
- 底层为Object类型的数组,改查效率高,增删效率低(数组扩容慢)
- 基本等同于Vector,但线程不安全,相比Vector执行效率较高
扩容(了解底层)
- ArrayList中维护了Object类型的数组elementDate
- new一个ArrayList时,若使用无参构造器,elementData初始大小为0。第一层add时,扩容为10,如果满了,扩容1.5倍
- 使用有参构造器,指定了初始容量,满了1.5倍
(2)Vector
特点
- 底层也是Object类型数组
- 线程安全,它的操作方法带synchronized。
扩容
- 无参构造器,初始容量为10,满了2倍扩
- Vector(int initialCapacity),指定初始容量
- Vector(int initialCapacity,int capacityIncrement),指定初始容量,指定扩容增量
(3)LinkedList
特点:
- 底层为双向链表
- 增删效率较高,改查较低
- 线程不安全
不需要扩容,增加节点即可
#一般程序中80-90都是查询,大部分情况使用ArrayList。
二.Set接口
特点:
- 无序,添加和取出顺序不一致,由hash值决定
- 不允许重复,最多包含一个null
- 无下标索引
实现类
常用TreeSet,HashSet
不能通过下标遍历,可以通过迭代器和增强for
HashSet
特点
- 底层为HashMap,数组+链表+红黑树
- 数组+链表,和链式hash表差不多、
扩容(底层)
- 添加元素时,通过hash值去索引table数组,若hash冲突了,就去判断重复,不重复就加在链表里面
- 如果长度到8了,且table数组大小满了MIN_TREEIFY_CAPACITY(默认64),会进化为红黑树。
- 链长到8,但table未满,会扩容2倍
- 第一次add,容量变到16
- size到达阈值0.75倍容量,就扩容
,