> 文章列表 > 4.5-4.6学习总结

4.5-4.6学习总结

4.5-4.6学习总结

学习的时候,重点是代码的底层逻辑,那些方法你只需要知道它存在即可,可查询api。

集合的扩容机制比较重要,要清楚它的底层逻辑,去debug。

一.List接口

(一)特点:

  1. 有序,可重复
  2. 支持下标索引
  3. 每个元素都有相应的下标记录位置,据此存取元素

(二)实现类

        常用的ArrayList,LinkedList,Vector

(三)遍历

        除了能有Collection的遍历方式外,还可以下标索引遍历

(1)ArrayList

特点

  1. 可加入null
  2. 底层为Object类型的数组,改查效率高,增删效率低(数组扩容慢)
  3. 基本等同于Vector,但线程不安全,相比Vector执行效率较高

扩容(了解底层)

  1. ArrayList中维护了Object类型的数组elementDate
  2. new一个ArrayList时,若使用无参构造器,elementData初始大小为0。第一层add时,扩容为10,如果满了,扩容1.5倍
  3. 使用有参构造器,指定了初始容量,满了1.5倍

(2)Vector 

特点

  1. 底层也是Object类型数组
  2. 线程安全,它的操作方法带synchronized。

扩容 

  1. 无参构造器,初始容量为10,满了2倍扩
  2. Vector(int initialCapacity),指定初始容量
  3. Vector(int initialCapacity,int capacityIncrement),指定初始容量,指定扩容增量

(3)LinkedList

 特点:

  1. 底层为双向链表
  2. 增删效率较高,改查较低
  3. 线程不安全

 不需要扩容,增加节点即可

#一般程序中80-90都是查询,大部分情况使用ArrayList。

 二.Set接口

特点:

  1. 无序,添加和取出顺序不一致,由hash值决定
  2. 不允许重复,最多包含一个null
  3. 无下标索引

实现类 

        常用TreeSet,HashSet

不能通过下标遍历,可以通过迭代器和增强for

HashSet

特点

  1. 底层为HashMap,数组+链表+红黑树
  2. 数组+链表,和链式hash表差不多、

 扩容(底层)

  1. 添加元素时,通过hash值去索引table数组,若hash冲突了,就去判断重复,不重复就加在链表里面
  2. 如果长度到8了,且table数组大小满了MIN_TREEIFY_CAPACITY(默认64),会进化为红黑树。
  3. 链长到8,但table未满,会扩容2倍
  4. 第一次add,容量变到16
  5. size到达阈值0.75倍容量,就扩容