Java Collections Framework - 1.Collection之接口层次结构

Java Collections Framework中大的接口分两部分:一部分是Collection接口及其子接口,另一部分是Map接口及其子接口。这里先主要记一下Collection接口相关的层次结构以及各个接口介绍。


java-Iterable.png
Interface Iterable<T>

Collection接口是框架的一部分,但是却不是最顶层接口,最顶层的接口是Iterable,但Iterable却不算是框架部分。实现Iterable接口的类需要能成为for-each loop的目标。大概意思就是能做for循环。在jdk1.8之前,实现这个接口需要实现的方法只有一个 Iterator<T> iterator(),该方法返回一个迭代器,1.8之后多了两个方法default void forEach(Consumer<? super T> action)default Spliterator<T> spliterator(),forEach方法传入一个action动作,处理每个对象;而spliterator方法则是返回一个分割的迭代器,使迭代更加快速。

Interface Collection<E>

该接口是Collection结构中的根接口。Collection表示一组对象,每个对象称为其元素。有些Collection允许重复元素,有些不允许;有些是有序的,有些是无序的。JDK中没有这个接口的直接实现类,但是该接口有许多Set或者List的子接口。所有的Collection实现类(通常是通过实现其子接口的类),都实现两个标准构造方法,一个是无参的构造方法,另一个是单个参数Collection的构造方法。后一个构造方法允许复制任何一个Collection生成一个指定类型的Collection。接口中不能规定构造函数,所以不能强制实现类都遵守这个约定,但是java库里的实现类都遵从。

Interface List<E>

一个有序的Collection,也叫序列。这个接口能够精确控制插入其中的每个元素,这个接口能够通过索引查询,访问其中任意元素。这与Sets不同,这里允许元素重复,如果允许插入null元素,也可以插入多个null元素。对于一些如LinkedList实现,通常迭代器比索引更好。该接口返回ListIterator,该迭代器除了有Iterator的方法,还允许插入,替换元素,允许双向访问。这里还提供一个从指定位置返回迭代器方法。List提供两种方法搜索对象,但是要谨慎使用,在一些实现中,会执行耗性能的线性搜索。常用的ArrayList就是实现了这个接口

Interface Queue<E>

翻译为队列,这里定义的方法总共有6个方法。并且只实现这个接口的类只有一个抽象类,其余的类实现该接口的同时还实现了其它接口。

抛出异常 返回特殊值
插入 add(e) offer(e)
移除 remove() poll()
检查 element() peek()

6个方法分两类,抛出异常的一种和不抛异常返回特殊值的。移除相关的方法返回队列第一个元素,并且从队列中删除该元素,而检查相关的方法则获取第一个元素,但是不会从队列中移除。通常应该避免在队列添加空元素(尽管某些队列可以添加null元素),这是因为由于poll方法在队列没有元素时,不抛出异常,而是返回null。

Interface BlockingQueue<E>

该接口继承自Queue接口。这个接口比父接口多了两个操作,获取元素时可以等待元素变的可用再获取,插入元素等待队列空间变的可用再插入。

抛出异常 特殊值 阻塞 超时
插入 add(e) offer(e) put(e) offer(e, time, unit)
移除 remove() poll() take() poll(time, unit)
检查 element() peek() 不可用 不可用

相比父接口,多了阻塞和超时两个种类。阻塞:插入时,如果空间不可用,当前线程会一直等待直到有空间存储。移除时,如果当前队列为空当前线程会一直等待,直到队列有可用元素移除。超时:与阻塞类似,不过可以指定等待的时间,如果超过指定时间仍不可用,仍会向下执行。
BlockingQueue接口不支持空元素,添加null会抛出空指针异常。因为null是poll方法操作失败的警戒值。
该接口是线程安全的,利用该接口的类可以实现消息队列,多生产者-多消费者模式,而不需要自己去处理相关线程安全的问题。

Interface TransferQueue<E>

自JDK1.7之后新增的一个接口。属于Collections框架的一部分。继承自BlockingQueue接口,它是一种生产者能够等待消费者接收元素的BlockingQueue。TransferQueue在一些消息传递的应用中非常有用,生产者可以使用transfer(E)等待消费者调用take或者poll来接收元素,也可以使用put而不需要等待去接收,同时还有无阻塞和超时两种版本的tryTransfer方法。同时hasWaitingConsumer()方法可以查询队列是否有线程正在等待接收。
与其它队列一样,TransferQueue也可能有容量限制,如果是这样,可能队列在一开始的transfer操作就可能会因为等待空间而阻塞,之后可能会为等待消费者接收而阻塞。如果队列的容量为0,就像SynchronousQueue,put和transfer效果是一样的。

Interface Deque<E>

double ended queue(双端队列),大多数没有容量限制。但是接口既支持有容量的,也支持没有容量限制的。deque与queue接口类似,不过可以在两端操作。方法操作失败结果有两种,一种是会抛出异常,另一种会返回特殊值(null或者false)。

第一个元素(头部) 最后一个元素(尾部)
抛出异常 特殊值 抛出异常 特殊值
插入 addFirst(e) offerFirst(e) addLast(e) offerLast(e)
移除 removeFirst() pollFirst() removeLast() pollLast()
检查 getFirst() peekFirst() getLast() peekLast()

与queue接口中等效的方法

Queue方法 等效 Deque 方法
add(e) addLast(e)
offer(e) offerLast(e)
remove() removeFirst()
poll() pollFirst()
element() getFirst()
peek() peekFirst()

与堆栈等效的方法

堆栈方法 等效 Deque方法
push(e) addFirst(e)
pop() removeFirst()
peek() peekFirst()

不支持通过索引访问元素。

Interface BlockingDeque<E>

继承了两个接口:Deque和BlockingQueue。与BlockingQueue继承Queue差不多,BlockingDeque是Deque的线程安全版本。提供队列可用的等待方法。

第一个元素(头部)
抛出异常 特殊值 阻塞 超时期
插入 addFirst(e) offerFirst(e) putFirst(e) offerFirst(e, time, unit)
移除 removeFirst() pollFirst() takeFirst() pollFirst(time, unit)
检查 getFirst() peekFirst() 不适用 不适用
最后一个元素(尾部)
抛出异常 特殊值 阻塞 超时期
插入 addLast(e) offerLast(e) putLast(e) offerLast(e, time, unit)
移除 removeLast() pollLast() takeLast() pollLast(time, unit)
检查 getLast() peekLast() 不适用 不适用

BlockingDeque可以直接用作FIFO的BlockingQueue,等效方法如下

BlockingQueue方法 等效的 BlockingDeque 方法
插入
add(e) addLast(e)
offer(e) offerLast(e)
put(e) putLast(e)
offer(e, time, unit) offerLast(e, time, unit)
移除
remove() removeFirst()
poll() pollFirst()
take() takeFirst()
poll(time, unit) pollFirst(time, unit)
检查
element() getFirst()
peek() peekFirst()

Interface Set<E>

与数学上集合概念一致,不包括重复元素,里边方法大致与Collection接口中继承的方法一致。

  • 这里需要注意的是将一个可变对象用作集合的元素,这里说的可变元素是指会改变equals比较的值。
  • 禁止向集合中添加自身。
  • 避免添加null元素。

Interface SortedSet<E>

继承自Set接口,顾名思义,排序的集合,其中的所有元素默认按自然顺序由小到大排序。
添加到其中的所有元素需要实现Comparable接口。注意compareToequals方法的一致性。
多出来的一些方法如下

方法 描述
E first() 返回集合中第一个元素
SortedSet headSet(E toElement) 返回当前集合的子集合,其元素小于toElement
E last() 返回集合中的最后一个元素
default Spliterator<E> Spliterator() 创建一个当前有序集合的Spliterator
SortedSet<E> subSet(E fromElement, E toElement) 返回包括fromElement不包括toElement的子集合
SortedSet <E> tailSet (E fromElement) 子集合大于fromElement

Interface NavigableSet<E>

扩展的SortedSet接口,多出的一些方法如下

方法 描述
E ceiling(E e) 返回此 set 中大于等于给定元素的最小元素;如果不存在这样的元素,则返回 null
Iterator descendingIterator() 以降序返回在此 set 的元素上迭代器
NavigableSet descendingSet() 返回此 set 逆序集合。
E floor(E e) 返回此 set 中小于等于给定元素的最大元素;如果不存在这样的元素,则返回 null
NavigableSet headSet(E toElement, boolean inclusive) 返回此 set 的部分视图,其元素小于(或等于,如果 inclusive 为 true)toElement
E higher(E e) 返回此 set 中严格大于给定元素的最小元素;如果不存在这样的元素,则返回 null
E lower(E e) 返回此 set 中严格小于给定元素的最大元素;如果不存在这样的元素,则返回 null
E pollFirst() 获取并移除第一个(最低)元素;如果此 set 为空,则返回 null
E pollLast() 获取并移除最后一个(最高)元素;如果此 set 为空,则返回 null
NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) 元素范围从 fromElementtoElement
NavigableSet tailSet(E fromElement, boolean inclusive) 元素大于(或等于,如果 inclusive 为 true)fromElement
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容