第9章 集合

第9章 集合

  • 在实现方法时,选择不同的数据结构会导致其实现风格以及性能存在着很大差异
  • 这里,将跳过理论部分,近介绍如何使用标准库中的集合类

9.1 Java集合框架

9.1.1 将集合的接口与实现分离

  • 队列接口的最简形式可能类似下面这样:
public interface Queue<E> {
    void add(E element);
    E remove();
    int size();
}
  • AbstractQueue是为类库实现者而设计的

9.1.2 Collection接口

  • 集合类的基本接口是Collection

9.1.3 迭代器

  • 编译器简单地将“for each”循环翻译为带有迭代器的循环

因此,应该将Java迭代器认为是位于两个元素之间。当调用next时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。

  • next方法和remove方法的调用具有互相依赖性,如果调用remove之前没有调用next将是不合法的

9.1.4 泛型实用方法

  • toArray

9.1.5 集合框架中的接口

  • 两个基本接口:Collection和Map

9.2 具体的集合

集合体系

9.2.1 链表

  • 在Java中,所有链表都是双向链表
  • ListIterator包含add方法,在迭代器位置之前添加一个新对象

为什么要优先使用链表呢?使用链表的唯一理由是尽可能地减少在列表中间插入或删除元素所付出的代价。如果列表只有少数几个元素,就完全可以使用ArrayList

9.2.2 数组列表

  • ArrayList封装了一个动态再分配的对象数组
  • ArrayList方法不是同步的,如果需要同步,可以使用Vector

9.2.3 散列集

  • 链表和数组可以按照人们的意愿排列元素的次序
  • 有一种众所周知的数据结构,可以快速地查找所需要的对象,这就是散列表hashtable
  • 散列表为每个对象计算一个整数,称为散列码hashCode
  • 散列码是由对象的实例域产生的一个整数
  • 如果自定义类,就要负责实现hashCode方法
  • hashCode方法要与equals方法兼容
  • 散列表用链表数组实现
  • 在JavaSE8中,桶满时会从链表变为平衡二叉树

9.2.4 树集

  • TreeSet是一个有序集合
  • 将一个元素添加到树中要比添加到散列表中慢

9.2.5 队列与双端队列

  • 不支持在队列中间添加元素
  • 队列:Queue
  • 双端队列:Deque

9.2.6 优先级队列

  • 使用了一个优雅且高效的数据结构,称为堆(heap)
  • 堆是一个可以自我调整的二叉树
  • 使用优先级队列的典型示例是任务调度

9.3 映射

  • 映射用来存放键/值对

9.3.1 基本映射操作

staff.forEach(k, v)->(System.out.println("key=" + k + ", value=" + v));

9.3.2 更新映射项

counts.merge(word, Integer::sum);

9.3.3 映射视图

  • 集合框架不认为映射本身是一个集合
  • 可以得到映射的视图(view),这是实现了Collection接口或某个子接口的对象
  • 3种视图
    1. 键集:Set<K> keySet()
    2. 值集合:Collection<V> values() values()
    3. 键值对集:Set<Map.Entry<K, V>> entrySet()

9.3.4 弱散列映射

  • 一个弱引用进入队列意味着这个键不再被他人引用,并且已经被收集起来,于是,WeakHashMap将删除对应的条目

9.3.5 链接散列集与映射

  • LinkedHashSet和LinkedHashMap
  • 链接散列映射将用访问顺序,而不是插入顺序,对映射条目进行迭代

9.3.6 枚举集与映射

  • EnumSet
  • EnumMap

9.3.7 标识散列映射

  • IdentityHashMap使用==而不是equals方法

9.4 视图与包装器

  • 视图包装了接口,只能访问接口中定义的方法

9.4.1 轻量级集合包装器

  • Collections工具类

9.4.2 子范围

  • subrange
  • List group2 = staff.subList(10, 20);

9.4.3 不可修改的视图

  • unmodifiableCollection
  • 使用原始的hashCode方法

9.4.4 同步视图

  • 类库的设计者使用视图机制来确保常规集合的线程安全,而不是实现线程安全的集合类

9.4.5 受查视图

  • checkedList

9.4.6 关于可选操作的说明

  • 通常,视图有一些局限性,即可能只可以读、无法改变大小、只支持删除而不支持插入

9.5 算法

  • 泛型集合接口有一个很大的优点,即算法只需要实现一次。

9.5.1 排序与混排

  • sort使用稳定的排序算法:即不需要交换相同的元素

9.5.2 二分查找

  • 只有采用随机访问,二分查找才有意义。快速定位中间位置的元素

9.5.3 简单算法

  • 替换:Collections.replaceAll("C++", "Java");

9.5.4 批操作

  • 通过视图实现批操作

9.5.5 集合与数组的转换

由于Java平台API的大部分内容都是在集合框架创建之前设计的,所以,有时候需要在传统的数组和比较现代的集合之间进行转换

  • asList
  • toArray

9.5.6 编写自己的算法

  • 如果编写自己的算法,应该尽可能地使用接口,而不要使用具体的实现类

9.6 遗留的集合

  • 从Java第1版问世以来,在集合框架出现之前已经存在大量遗留的容器类

9.6.1 Hashtable类

  • Hashtable类与HashMap类的作用一样,是线程安全的
  • 如果需要并发访问,应该使用ConcurrentHashMap

9.6.2 枚举

  • 遗留集合使用Enumeration接口
  • 集合体系使用Iterator接口
  • 传递集合要比传递迭代器更为明智

9.6.3 属性映射:Properties

  • property map
    • 键与值都是字符串
    • 表可以保存到一个文件中,也可以从文件中加载
    • 使用一个默认的辅助表

9.6.4 栈

  • Stack类扩展于Vector类
  • push和pop方法

9.6.5 位集

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