java8集合框架(一)-概述

java8集合框架(一)-概述

概述

java8的集合框架主要包括:List,Map,Set,Queue,Collection,Iterable,Enumeration等接口,以及Dictionary抽象类,和Collections,Arrays工具类。又区分线程安全和非线程安全。

Collections系列

  • Iterable接口为Collections系列的实现定义了可供遍历的签名,只含有一个方法签名(这里不包括default方法,下同),通过返回Iterator提供查询是否含有下一个元素,获取下一个元素和删除元素的方法

    • Iterator iterator();
  • Collection接口继承于Iterable接口,它高度抽象了ListSet,定义了集合类的基础操作签名,如增删,查询大小、状态等。

    • int size();
    • boolean isEmpty();
    • boolean contains(Object o);
    • Object[] toArray();
    • boolean add(E e);
    • boolean remove(Object o);
    • void clear();
    • boolean containsAll(Collection<?> c);
    • boolean addAll(Collection<? extends E> c);
    • boolean removeAll(Collection<?> c);
    • boolean retainAll(Collection<?> c);
  • List接口继承于Collection接口,用来存放有序,可重复的元素。定义了基于position的的读/写/查询方法签名,也提供了一个特别的迭代器ListIterator来支持增加、修改,双向遍历元素。

    • E get(int index);
    • E set(int index, E element);
    • void add(int index, E element);
    • E remove(int index);
    • int indexOf(Object o);
    • int lastIndexOf(Object o);
    • ListIterator listIterator();
    • ListIterator listIterator(int index);
    • List subList(int fromIndex, int toIndex);
  • Set接口继承于Collection接口,用来存放无序,不重复的元素。它并未新增方法签名。另外Set的很多子接口都能与Map的子接口对应。其实很多时候,Set的实现都是基于Map实现,Set中的元素就是Map中的key

  • SortedSet接口继承于Set接口,提供了排序功能相关的签名,让Set成了有序的不重复的容器。类似于SortedMap

    • Comparator<? super E> comparator();
    • SortedSet subSet(E fromElement, E toElement);
    • SortedSet headSet(E toElement);
    • SortedSet tailSet(E fromElement);
    • E first();
    • E last();
  • NavigableSet接口继承于SortedSet,提供了最接近项的匹配。类似于NavigableMap

    • E lower(E e);
    • E floor(E e);
    • E ceiling(E e);
    • E higher(E e);
    • E pollFirst();
    • E pollLast();
    • NavigableSet descendingSet();
    • Iterator descendingIterator();
  • Queue接口继承于Collection接口,它定义了一组元素形成的队列,提供了出队列、入队列、观察队列元素的方法签名。每个操作定义了两个形态:其中一个当操作失败会抛出异常,另一个会返回特定的值指示操作失败。

    • boolean add(E e);
    • boolean offer(E e);
    • E remove();
    • E poll();
    • E element();
    • E peek();
  • Deque接口继承于Queue接口,名字来自于double ended queue。这是一个非常强大的接口。它可以模拟出queue(FIFO)和stack(LIFO)的行为。甚至于优先使用Deque来替代stack

    • void addFirst(E e);
    • void addLast(E e);
    • boolean offerFirst(E e);
    • boolean offerLast(E e);
    • E removeFirst();
    • E removeLast();
    • E pollFirst();
    • E pollLast();
    • E getFirst();
    • E getLast();
    • E peekFirst();
    • E peekLast();
    • boolean removeFirstOccurrence(Object o);
    • boolean removeLastOccurrence(Object o);
    • void push(E e);
    • E pop();
  • BlockingQueue继承于Queue接口,线程安全。它不允许存在null元素。删除/添加有四种形态。一种操作失败抛异常,一种返回特定值,一种block等待,一种在指定时间内返回特定值,否则抛异常。接口的实现可以很好的实现生产者消费者模型。当生产者向队列添加元素但队列已满时,生产者会被阻塞;当消费者从队列移除元素但队列为空时,消费者会被阻塞。

    • void put(E e) throws InterruptedException;
    • boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException;
    • E take() throws InterruptedException;
    • E poll(long timeout, TimeUnit unit) throws InterruptedException;
    • int remainingCapacity();
    • int drainTo(Collection<? super E> c);
    • int drainTo(Collection<? super E> c, int maxElements);
  • BlockingDeque继承于DequeBlockQueue接口。线程安全。它的情况跟BlockingQueue情况类似,操作有四种形态,也不允许存在null元素。

    • void putFirst(E e) throws InterruptedException;
    • void putLast(E e) throws InterruptedException;
    • boolean offerFirst(E e, long timeout, TimeUnit unit) throws InterruptedException;
    • boolean offerLast(E e, long timeout, TimeUnit unit) throws InterruptedException;
    • E takeFirst() throws InterruptedException;
    • E takeLast() throws InterruptedException;
    • E pollFirst(long timeout, TimeUnit unit) throws InterruptedException;
    • E pollLast(long timeout, TimeUnit unit) throws InterruptedException;
  • TransferQueue继承于BlockQueue接口。线程安全,生产者会一直阻塞直到所添加到队列的元素被某一个消费者所消费。

    • boolean tryTransfer(E e);
    • void transfer(E e) throws InterruptedException;
    • boolean tryTransfer(E e, long timeout, TimeUnit unit) throws InterruptedException;
    • boolean hasWaitingConsumer();
    • int getWaitingConsumerCount();

Map系列

  • Map接口的实现类保存了key/value的映射关系。Map中的key是唯一的,一个key最多能映射最多一个value。它被用来取代Dictionary抽象类。最重要的一点是key必须是不可变的。接口定义了通用的操作:获取,删除,添加,判断是否存在key,提供了若干遍历方法签名,如keySet,values,entrySet。

    • int size();
    • boolean isEmpty();
    • boolean containsKey(Object key);
    • boolean containsValue(Object value);
    • V get(Object key);
    • V put(K key, V value);
    • V remove(Object key);
    • void putAll(Map<? extends K, ? extends V> m);
    • void clear();
    • Set keySet();
    • Collection values();
    • Set> entrySet();
  • SortedMap接口继承于Map接口,它额外添加了comparator签名,用来做key的排序。因为对key进行了排序,所以定义了headMaptailMap这样的方法签名来获取满足key大小条件的Map子集合。

    • Comparator<? super K> comparator();
    • SortedMap subMap(K fromKey, K toKey);
    • SortedMap headMap(K toKey);
    • SortedMap tailMap(K fromKey);
    • K firstKey();
    • K lastKey();
  • NavigableMap接口继承于SortedMap接口,它具有根据给定搜索目标返回最接近匹配项的导航方法签名。例如不超过key的方法ceilingEntry等。

    • Map.Entry lowerEntry(K key);
    • K lowerKey(K key);
    • Map.Entry floorEntry(K key);
    • K floorKey(K key);
    • Map.Entry ceilingEntry(K key);
    • K ceilingKey(K key);
    • Map.Entry higherEntry(K key);
    • K higherKey(K key);
    • Map.Entry firstEntry();
    • Map.Entry lastEntry();
    • Map.Entry pollFirstEntry();
    • Map.Entry pollLastEntry();
    • NavigableMap descendingMap();
    • NavigableSet navigableKeySet();
    • NavigableSet descendingKeySet();
    • NavigableMap subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive);
    • NavigableMap headMap(K toKey, boolean inclusive);
    • NavigableMap tailMap(K fromKey, boolean inclusive);
  • ConcurrentMap接口继承于Map接口,线程安全。java1.5版本加入,定义了只能在键不存在时将元素加入到map中,只有在键存在并映射到特定值时才能从map中删除一个元素的签名。它的实现也是我们后面重点分析的对象。

    • V putIfAbsent(K key, V value);
    • boolean remove(Object key, Object value);
    • boolean replace(K key, V oldValue, V newValue);
    • V replace(K key, V value);
  • ConcurrentNavigableMap继承于ConcurrentMapNavigableMap,未添加新的函数签名,线程安全

工具类

  • Arrays工具类主要提供了针对数组的各种工具方法的实现。主要实现了桥梁方法asList,二分查找,拷贝,相等,填充,hash,排序,stream,toString等方法,后续会详细阅读源码。

    • List asList(T… a)
    • binarySearch
    • copyOf
    • copyOfRange
    • equals
    • fill
    • hashCode
    • sort
    • stream
    • toString
  • Collections工具类主要提供了针对collection类型(包括map类型)的各种工具方法,主要实现了添加,查找,空对象,填充,乱序,同步转换,和不可修改转换,后续会详细阅读源码。

    • addAll
    • checkedList
    • emptyMap
    • max
    • synchronizedList
    • unmodifiableSet

已废弃或不推荐使用的接口/类

  • Dictionary抽象类 优先使用Map接口的实现类
  • Vector实现类 优先使用ArrayList
  • Stack实现类 优先使用Deque接口的实现类
  • Enumeration接口 优先使用Iterable接口

类图

类图

参考

作者: wuzhaoyang(John)
出处: http://wuzhaoyang.me/
因为作者水平有限,无法保证每句话都是对的,但能保证不复制粘贴,每句话经过推敲。希望能表达自己对于技术的态度,做一名优秀的软件工程师。