Java集合框架概述

前言

Java集合框架概述; 主要总述Java集合框架的设计理念, 组成和基本接口(及其区别等)

博客同步至个人博客


正文


一. 设计理念

  1. 在Java 2之前,Java是没有完整的集合框架的。它只有一些简单的可以自扩展的容器类,比如Vector,Stack,Hashtable等)

  2. Java集合其实就是一组对象的集合

  3. 独立于实现细节, 方便重用, 保证向下兼容(即保留了Vector等旧的API)

  4. 加强了API之间的互通信, 减少了新API的学习: 提供尽量统一的接口


二. 基本组成

2.1 总述

Java集合框架主要分为三个部分: 接口, 实现和算法

2.1-1 接口

接口指的是以CollectionMap为起始的一系列公用接口

实际上从Map出发的并不是真正的集合, 只是其包含集合视图操作, 所以也将其归入集合框架中

Collection出发的公用接口主要有以下几个, 也是这次会着重讲解和比较的; 当然, 下面的接口并不全面, 在后面会逐渐扩展和补充

Collection基本接口.png

Map出发的公用接口如下

Map基本接口.png

当然, 上述列举出来的子接口都是直接继承自Collection或者Map, 对于其子接口的子接口, 这里并没有列出在这里(比如NavigableMap接口是SortedMap接口的子接口, 而不是直接继承Map的, 所以这里并没有直接列出来)

2.1-2 实现

实现指的是接口的实现类, 这里笔者在官网找到一张表, 如下, 很好的列出了平时重点所用的实现类

Interface Hash Table Resizable Array Balanced Tree Linked List Hash Table + Linked List
Set HashSet TreeSet LinkedHashSet
List ArrayList LinkedList
Deque ArrayDeque LinkedList
Map HashMap TreeMap LinkedHashMap

当然, 还应该包含Java 2以前几个旧API, 即: Vector, Stack, Hashtable

2.1-3 算法

(1). 算法

算法指的是以Collections为主的提供的一系列对集合的操作, 参见下图, 列出了其提供的常用算法

Collections方法.png

下面对上述方法进行一些简单解释

  1. sort(List): 使用归并排序, 保证NlogN的时间复杂度和稳定性

  2. binarySearch(List, Object): 在一个有序的List中使用二分查找

  3. reverse(List): 逆转List

  4. shuffle(List): 将List中的元素随机重排

  5. fill(List, Object): 使用指定值(Object)覆盖List中所有元素

  6. copy(List dest, List src): 拷贝

  7. min(Collection): 返回最小值

  8. max(Collection): 返回最大值

  9. rotate(List list, int distance): 将List中元素旋转指定distance

  10. replaceAll(List list, Object oldVal, Object newVal): 将List中出现的所有oldVal替换为newVal

  11. indexOfSubList(List source, List target): 返回source中与target匹配的第一个子项的首元素索引

  12. lastIndexOfSubList(List source, List target): 返回最后一个匹配子项的首元素索引

  13. swap(List, int, int): 交换指定位置的两个元素

  14. frequency(Collection, Object): 找出指定元素出现次数

  15. disjoint(Collection, Collection): 判断两个集合是否包含相同元素(即集合是否相交)

  16. addAll(Collection<? super T>, T...): 将指定元素添加到指定集合中

(2). 包装类

当然, 实际上Collections提供的不仅仅是针对集合的算法, 其还提供了一系列对集合的包装类(即Wrapper), 主要包括以下三大类:

  1. Collections.unmodifiableInterface(): 返回一个不可修改的集合, 包括UnmodifiableCollection, UnmodifiableSet, UnmodifiableList; 实现原理是在修改集合的操作上(如add(), remove()等)抛出异常

  2. Collections.synchronizedInterface(): 返回一个线程安全的集合, 包括SynchronizedCollection, SynchronizedSet, SynchronizedList; 实现原理是在需要同步的方法上添加synchronized限制

  3. Collections.checkedInterface(): 返回一个类型检查的集合, 包括CheckedCollection, CheckedQueue, CheckedSet, CheckedList; 实现原理是在add()的时候进行类型检查, 如果是非法类型, 就抛出异常ClassCastException; 这里的类型检查实际上是使用Class.isInstance()来检查的, 关于该方法和instanceof运算符的区别, 参见博客; (大致上, 二者是等价的, 只是isInstance()是在运行时才进行类型检查, 故可用于反射, 泛型;
    但是instanceof需要在编译时知道类的具体类型(重点理解在动态等价))

这些包装类的作用主要是满足平时一些特殊的需求, 比如同步, 不可修改等


三. 基本接口

在这一节, 主要讲解上面提到的几个基本接口, 这里不会涉及到其实现类

3.1 Collection

Collection是集合框架中一个最顶层的基本接口, 提供了一个数据集的基本描述, 在官方API中并没有提供其直接实现类, 而是在其基础上提供了进一步的限制接口, 即List, Set, Queue; 这样做的好处有:

  1. 代码复用: 从面向对象的角度讲, 抽取出一个顶级接口, 有助于用户代码复用, 即编写一个接口, 实现不同传参(Collection的各种实现类), 实际上也是利用了多态(官方文档的解释是: 实现最大通用性)

  2. 易于扩展: 符合面向对象的思想, 即将数据集抽象, 通过不同的需求对其实现不同方便的限制, 易于扩展; 同时减少新API学习成本

Collection提供了数据操作的基本方法, 如add(), remove(), size(), clear()等; 同时, 其还继承了Iterable接口, 这个接口是用于使用迭代器遍历集合用的, 使用迭代器遍历集合的优点是我们不必知道集合的内部结果,集合的内部结构、状态由Iterator来维持, 通过统一的方法hasNext(), next()来判断和获取下一个元素

3.2 List

ListCollection上做的限制是, 元素有序(但并不是排序), 允许重复元素; 同时还将迭代器换成了ListIterator; 关于ListIterator, 其允许双向的迭代, 以及元素插入(ListIterator.add()), 删除(ListIterator.remove())和替换ListIterator.set()

JDK9中, 还提供了一个List.of()的静态方法, 用于返回一个不可变List(Immutable List)

3.3 Set

SetCollection上做的限制是, 元素不重复, 至多一个null元素

JDK9中, 还提供了一个Set.of()的静态方法, 用于返回一个不可变的Set

3.4 Queue

QueueCollection上做的限制是, 除了Collection提供的基本操作外, 还提供了一些额外的操作, 分为两类, 一个返回特定值, 另一个抛出异常, 见下表

Throw Exception Return Special Value
Insert add(e) offer(e)
Remove remove() poll()
Examine element() peek()

3.5 Map

Map本质上是一组键值对, Map允许单独访问key(通过keySet()返回keySet), 也可以单独访问value(通过values()方法返回valueCollection), 也可以通过entrySet()获取key-value的对应关系

四. 参考链接

  1. 官方文档--集合框架指南

  2. 集合框架的分类

  3. 集合框架设计理念答疑文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272