java.util 概述之集合框架

Package java.util
Contains the collections framework, legacy collection classes, event model, date and time facilities, internationalization, and miscellaneous utility classes (a string tokenizer, a random-number generator, and a bit array).

java.util是java语言的一个重要部分,其内容除了我们熟知的集合框架及其实现类外,还定义了事件模型,日期时间工具类,国际化和其他实用程序类(字符串标记器,随机数生成器和位数组)。

现在,让我们具体看看这个包下面都有哪些接口和类,都能为我们提供哪些功能。

Collection 集合框架

Java中的集合分为两大类,一类继承自Collection接口,包括List、Set、Queue等三种数据结构,一类是继承自Map接口的映射集合类。

Collection集合框架给我们展示了一种理想的类型框架实现方案:

  • 1、用接口定义类型
    接口和类都可以用于定义类型。相比于具体的实现类,接口和抽象类不必纠结于实现,只需要定义好类型的行为(抽象方法);而Java是单继承的,所以接口比抽象类在定义类型中具备了更大的灵活性。
    Collection接口定义了容器的基本使用功能——存取数据。Set、Queue、List是Collection的子接口,分别代表了三种常用的数据结构——不包含重复元素的集合,先进先出的队列,有序的数组。


    Interface.png
  • 2、用抽象类继承接口,完成基本的实现
    接口在定义类型上有其优势,但是接口不能包含实现。而对于集合这一类型,即使有再多分类,其实现也会有一些共同之处。用抽象类继承接口,可以接管其实现功能,又不破坏接口带来的继承灵活性。其优点在《Effective Java》中有所提及:

通过对你导出的每个重要接口都提供一个抽象的骨架实现类(AbstractInterface),把接口和抽象类的优点结合起来。接口的作用仍然是定义类型,但是骨架实现类接管了所有与接口实现相关的工作。


AbstractClass.png
  • 3、丰富实现
    框架有了,最后就是得在框架中提供几个具体的实现给程序员使用。


    Implement.png

Map 框架

map是一种提供key-value映射关系的数据结构。相比于Collection,Map框架结构简单很多,但是其实现类却丰富得多,实现也各有千秋,复杂了很多。


Map.png

Map的实现类比较常用的有四个:HashtableHashMapTreeMapLinkedHashMap

  • Hashtable:基于哈希表+链表
    Hashtable事实上是java 1.0的一个遗留类,在java 1.2重构,实现了Map接口,归纳到了Java集合框架中。不同于java.util包中的其他集合类,hashtable是线程安全的,但是并不推荐在开发中使用这个类,请在单线程中使用HashMap,在多线程中使用ConcurrentHashMap。
  • HashMap:基于哈希表+链表+红黑树
    在java 1.8中,HashMap得到了重构,在哈希表+链表的实现上增加了红黑树,以应对hash冲突带来的性能退化。
  • TreeMap:基于红黑树
    TreeMap实现SortedMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。
  • LinkedHashMap:基于哈希表+链表
    LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。LinkedHashMap在节点上增加了两个指针(before、after),在HashMap实现的哈希表(数组)基础上,将节点串成一个双向链表,以保存节点的插入顺序。同时,在遍历上,LinkedhashMap要比HashMap要快,因为HashMap需要遍历整个哈希表(可能是非常大且稀疏的数组),而LinkedHashMap则可以通过双向链表进行遍历。

哈希表的搜索复杂度是O(1),链表的搜索复杂度是O(n),红黑树(平衡树)的搜索复杂度是O(log n)。Hashtable是基于哈希表实现的,哈希表受限于数组大小、哈希函数的实现、数据量的增长往往会面临hash冲突的风险。Hashtable和少量数据的HashMap在应对hash冲突上采用了拉链法,即在冲突的域上用链表将节点串连起来。当冲突达到一定规模,会将原本O(1)的搜索复杂度提升到O(n)。所以HashMap的重构,在应对hash冲突上,对搜索效率的提升是有很大帮助的。

Iterator 框架

Iterator并不是一个集合接口,然而对于Java Collection Framework来说确实一个非常重要的部分——它是Collection接口的父接口,为Collection和Map(keySet、valueSet)提供了迭代遍历的功能定义,是一个功能性接口。

在java 1.2之前,java集合框架的遍历功能由Enumeration提供,在Hashtable和Vector中,我们还能看到它的影子。相比于Enumeration,Iterator在方法命名上更简单(hasMoreElements()->hasNext()nextElement()->next()),而且增加了remove()方法,支持在底层集合中删除Iterator当前所指的对象。在java 1.8中,Iterator增加了forEachRemaining(),支持以Lambda表达式的形式遍历集合。

Iterator.png

作为一个功能接口,集合类都需要直接或间接实现这个Iterator接口已提供遍历功能。但是作为迭代功能的接口却很少,在java 1.2中有一个ListIterator,正对List的操作,增加了add()set()nextIndex()hasPrevious()previous()previousIndex()方法;在java 1.8中,增加了PrimitiveIterator作为基本类型的专属迭代器,减少不必要的 boxing、unboxing 开销。

Collections

java.util还提供了Collections工具类帮助我们处理集合。
Collections是一个非常强大的工具类,针对集合操作提供了大量方法,合理地利用这个类处理集合问题可以有效地提高我们的工作效率。
具体方法请参看Collections官方文档

参考

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

推荐阅读更多精彩内容

  • 概述 Java集合框架由Java类库的一系列接口、抽象类以及具体实现类组成。我们这里所说的集合就是把一组对象组织到...
    absfree阅读 1,243评论 0 10
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 869评论 0 1
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,483评论 0 3
  • 1. 问题描述 手机发射的热点,信号很不稳定,使用不方便。通过手机usb连接wifi效果可以更稳定。但电脑上首先要...
    马骋阅读 1,025评论 0 0
  • 今天10月1号,早上起来和子熙去了公园,他老是不专心,车子扭来扭去,我烦燥地拍了他屁股,他不服气哭了,指责我不该打...
    嫣熙一笑阅读 176评论 0 0