集合-容器解析

一、容器的分类

集合较完整的分类

红色虚线框:接口
绿色实线框:抽象类
黑色实线框:类

二、基本概念

Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:

  1. Collection,一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照队列规则来确定对象尝试的顺序(通常与它们被插入的顺序相同),双端队列是一个特例,它是队列的子接口可以在两端插入和删除数据
  2. Map,一组成对的“键值对”对象,允许使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在了一起。映射表允许我们使用另一个对象来查找某个对象,它也被称之为“关联数组”,因为它将某些对象与另外一些对象关联在了一起,或者称之为“字典”,因为你可以使用键对象来查找值对象,就像在字典中使用单词来定义一样。Map是强大的编程工具。

三、Collection接口

Collection接口是Set,Queue,List的父接口。Collection接口中定义了多种方法可供其子类进行实现,以实现数据操作。
Collection是描述所有序列容器的共性的根接口,它可能被认为是一个附属接口,因为要表示其他若干个接口的共性而出现的接口。

3.1 相关方法

Collection相关方法

上图中是Collection中的所有方法,但是在开发过程中核心使用的方法主要有增加、删除,迭代等方法
其中重点是iterator()方法,该方法返回是迭代器,可以遍历集合中元素

3.2 迭代器

任何容器类,都必须有某种方式插入元素并将它们再次取回。毕竟,持有事物是容器最基本的工作。
迭代器的概念可以用于一个目的:面向接口编程。如果面向具体的集合编程可能由于某些原先需要替换原来的集合,那么遍历方法就需要重写,如果采用迭代器就减少了一部分的工作量。
迭代器时一个对象,它的工作时遍历并选择序列中的对象,而客户端程序员不需要只掉该序列的底层数据结构。
迭代器通常被称为轻量级对象:创建它的代价小,因此可以见到对迭代器有些奇怪的限制。

3.2.1 迭代器相关API

迭代器相关API

3.2.2 与迭代器相关的操作

  1. 使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
  2. 使用next()获得序列中的下一个元素。
  3. 使用hasNext()检查序列中是否还有元素。
  4. 使用remove()将迭代器新近返回的元素删除。remove元素之前必须先调用next(),因为remove移除的是新近返回的元素,如果没有调用next()就没有新近返回的元素。

3.2.3 Iterable

这个接口表示可迭代的,而且Collection接口继承了该接口。这个接口在JDK1.5中加入。
ForEach语法可以应用于实现了Iterable接口的类。
API文档

Implementing this interface allows an object to be the target of the "for-each loop" statement
实现此接口允许对象成为“for-each loop”语句的目标。

3.2.4 ListIterator

ListIterator

这个接口增加了一些方法,来适用于List相关的底层数据接口。
比如可以向前移动,修改等。

3.3 fail-fast机制,快速报错机制

Java容器类类库采用快速报错机制。它会探查ConcurrentModificationException异常。就是快速报错的意思。
这个机制主要是在迭代器中实现的。防止多线程在数据遍历是进行修改。

四、List

  1. List承诺可以将元素维护在一个特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移除元素。
  2. List集合代表一个元素有序、可重复的集合,集合中每个元素都其对应的顺序索引。
  3. List允许使用重复的元素,可以通过索引来访问指定位置的集合元素。List默认按元素的添加顺序设置元素的索引。
  4. List作为Collection接口的子接口,可以使用Collection接口里的全部方法。而且由于List是有序集合,因此List集合里增加了一些根据索引来操作集合元素的方法。

4.1 相关的API

List相关方法

4.2 ArrayList

它长于随机访问元素,但是在List的中间插入和移动元素时较慢
具体参考:集合-ArrayList解析

4.3 LinkedList

它通过代价较低的在List中间进行的插入和删除操作,提供了优化的顺序方法。LinkedList在随机访问方面相对比较慢,但是他的特性集较ArrayList更大
具体参考:集合-LinkedList解析

五、Set

5.1 相关的API

Set相关的API

5.2 概述

存入Set的每一个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

具体参考:集合-Set解析

六、Queue

队列是一个典型的先进先出的容器。即从容器的一段放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是相同的。队列常备当做一种可靠的将对象从程序中的某个区域传输到另一个区域的途径。队列在并发编程中特别重要

6.1 相关的API

Queue相关的API

6.2 PriorityQueue

先进先出描述最典型的队列规则。队列规则则是值在给定一组队列中的元素的情况下确定下一个优先弹出队列的元素的规则。先进先出声明的下一个元素应该是等待时间最长的元素。
优先级队列生命下一个弹出的元素时最需要的元素。
优先级队列在队列插入的时候根据Compartor(Comparable)进行排序。
具体参考队列

6.3 Dueue,双端队列

支持两端元素插入和移除的线性集合。
LinkedList实现了双端队列的API


双端队列相关API

6.4 ArrayDeque

默认长度是16的循环数组。
使用head和tail两个int类型的字段来记录数组的开始和结尾。
如果head和tail相等,那么就进行数据扩容,扩容是将数据copy到扩容后的数组,并且新数组中的数据是从0位置开始的。

七、Map

将对象映射到其他对象的能力是一种解决编程问题的杀手锏。

7.1 Map相关的API

Map相关方法

7.2 具体实现及说明

实现 说明
HashMap* Map基于散列表的实现(它取代了Hashtable)。插入和查询“键值对”的开销是固定的。可以通过构造器设置容量和负载因子,以调整容器的性能。
LinkedHashMap 类似于HashMap,但是迭代遍历它是,取的“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点;而在迭代访问时反而更快,因为它使用链表维护内部次序
TreeMap 基于红黑树的实现。查看“键”或“键值对”是,他们会被排序(次序由Comparable或Comparator决定)。TreeMap的特点在于,所得到结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树
WeakHashMap 弱键(weak key)映射,允许释放映射所指向的对象,这是为解决某类特殊问题而设计的。如果映射之外没有引用指向某个“键”,则此“键”可以被垃圾收集器回收
ConcurrentHashMap 一种线程安全的Map,它不涉及同步加锁。
IndentityHahsMap 使用==代替equals()对“键”进行比较的散列映射,专为解决特殊问题设计的。

八、工具类

8.1 Collections

处理集合相关的工具类

Collections相关方法

8.2 Arrays

处理数组的工具类
该类包含用于操作数组的各种方法(如排序和搜索)。 该类还包含一个静态工厂,可以将数组视为列表。

参考

  1. 中文API文档,该链接中有多个翻译版本的API文档
  2. Google翻译的文档
  3. 官方文档
  4. 集合框架

其他文章

容器解析
ArrayList解析
LinkedList解析
TreeMap解析(上)
TreeMap解析(下)
HashMap解析
LinkedHasMap解析(下)
Set解析

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

推荐阅读更多精彩内容

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 869评论 0 1
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 本篇文章带你从Java源码深入解析关于Java容器的概念。 参考文献: Java容器相关知识全面总结 Java官方...
    Tsy远阅读 19,756评论 13 142
  • 集合框架体系概述 为什么出现集合类?方便多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方法. 数组...
    acc8226阅读 767评论 0 1
  • 文/然岁 1. 《欢乐颂》第一部里,有个情节我记得蛮清楚的。曲筱绡去安迪家问GI代理的一些事情,被关关看到了。关关...
    然岁阅读 4,851评论 111 227