Collection

147 阅读2分钟

JDK集合类

Collection类图

classDiagram

Iterable <|-- Collection
Iterator <|-- ListIterator
Iterable ..> Iterator
ListIterator <.. List

Collection <|-- List
Collection <|-- Queue
Queue <|-- Deque
Collection <|-- Set

RandomAccess <|.. ArrayList
List <|.. ArrayList
Deque <|.. ArrayList

List <|.. LinkedList
Deque <|.. LinkedList

Set <|.. HashSet
Set <|-- SortedSet
HashSet <|.. LinkedHashSet

SortedSet <|.. NavigableSet
NavigableSet <|.. TreeSet

Iterator接口

classDiagram
class Iterable {
  hasNext() boolean
  next() E
  remove()
  forEachRemaining(Consumer<? super E> action
}
  • hasNext和next方法结合使用遍历元素
  • nexth和remove结合使用删除元素
  • forEachRemaining提供函数式编程访问元素
    默认方法使用hasNext和next实现
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
    

ListIterator接口

  • hasPrevious/hasNext和previous和next方法结合使用向前和向后遍历
  • 使用nextIndex和previsIndex方法得到相应的index
  • 使用set和remove可以改变或者删除当前元素
  • 使用add方法添加元素,如果next元素存在插入在next之前,如果previous元素存在插入在previous之前,如果next和previous元素都不存在,作为唯一元素插入

Collection接口

  • 使用add,addAll, remove, removeIf, removeAll, clear方法添加删除元素
  • 使用retainAll方法保留存在于参数集合内的元素
  • 使用size和isEmpty方法
  • 使用iterator遍历集合内的元素
  • 支持stream, prallelStream处理元素

List, Set, Queue, Deque

  • List在Colleciton接口的基础上加上有序集合(维护插入顺序)。支持按index操作元素,元素可以重复,是否支持null元素由实现类决定
  • Set在Collection接口的基础上添加不包含重复(equals)元素的约束。是否支持null元素由实现类决定,但是最多只能有一个null元素。
    • SortedSet支持自动排序
      • first最小
      • last最大
    • NavigableSet支持取最靠近目标值的元素,不存在返回null或者抛出异常由实现类决定
      • ceiling: >= target中最小
      • higher:> target中最小
      • floor: <= target中最大
      • lower: < target中最大
      • headSet: <= target (inclusive参数决定是否包含等于,下同)
      • tailSet: >= target
      • subSet: fromElement <= subSetElement <= toElement
      • pollFirst/pollLast返回并且删除最小/最大元素
  • Queue
    • poll <- Queue <- offer
    • remove <- Queue <- add (throw exception)
    • peek/element(throw exception) 返回但不删除
  • Deque支持对首位元素操作的集合

RandomAccess接口

  • 用来标识实现类支持对元素的快速随机访问

ArrayList

  • 使用数组实现的List,支持快速随机访问。
  • 当数组elementData不够用的时候,默认扩充原来百分之五十的大小
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    
  • 如果知道需要创建的List会有多少元素,在构造器中传入capacity,避免重新分配数组,提高性能
  • 方法trimToSize方法可以压缩数组,释放不用的空间
  • 父类AbstactList的变量modCount记录list的结构变化次数。在遍历数组时会检查modCount是否为期望的值,如果不是会抛出ConcurrentModificationException异常。
  • 内部类Itr实现Iterator
    • cursor属性对应next elemnt的index
    • lastRet属性为上一次调用next返回的元素的index,初始值为-1
    • expectedModCount属性为期望的List修改次数,
    • 调用next方法会使cursor会加1,lastRet等于原来的cursor
    • 调用remove前需要调用next,调用remove后会使cursor减去1,lastRet变为-1
  • 内部类ListItr继承Itr实现ListIterator
    • prevois方法使,cursor减一,然后取cusor位置的元素
  • 内部类SubList用来取当前List中从fromIndex到toIndex(不包含)的元素组成的子List
    • parent属性为父List
    • parentOffset相对于父List的位移(父list可能也是SubList)
    • offset属性为绝对位移(相对ArrayList的位置)
    • 由于SubList保存的是通过位移直接操作ArrayList的元素,所以修改SubList会导致ArrayList被修改。