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返回并且删除最小/最大元素
- SortedSet支持自动排序
- 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被修改。