第十二章 集合

java.util 库提供了一套相当完整的集合类(collection classes)来解决这个问题,其中基本的类型有 ListSetQueueMap

不要在新代码中使用遗留类 VectorHashtableStack

泛型和类型安全的集合

new ArrayList<>()

有时被称为“菱形语法”(diamond syntax)。在 Java 7 之前,必须要在两端都进行类型声明

ArrayList<Apple> apples = new ArrayList<Apple>();

当指定了某个类型为泛型参数时,并不仅限于只能将确切类型的对象放入集合中。向上转型也可以像作用于其他类型一样作用于泛型。

添加元素组

java.util 包中的 ArraysCollections 类中都有很多实用的方法。

List<Snow> snow2 = Arrays.asList(new Light(), new Heavy());
Collections.addAll(snow3, new Light(), new Heavy(), new Powder());

集合的打印

必须使用 Arrays.toString() 来生成数组的可打印形式。但是打印集合无需任何帮助。

列表List

有两种类型的 List

  • 基本的 ArrayList ,擅长随机访问元素,但在 List 中间插入和删除元素时速度较慢。
  • LinkedList ,它通过代价较低的在 List 中间进行的插入和删除操作,提供了优化的顺序访问。 LinkedList 对于随机访问来说相对较慢,但它具有比 ArrayList 更大的特征集。

迭代器Iterators

迭代器是一个对象,它在一个序列中移动并选择该序列中的每个对象,而客户端程序员不知道或不关心该序列的底层结构。另外,迭代器通常被称为轻量级对象(lightweight object):创建它的代价小。因此,经常可以看到一些对迭代器有些奇怪的约束。例如,Java 的 Iterator 只能单向移动。这个 Iterator 只能用来:

  1. 使用 iterator() 方法要求集合返回一个 Iterator。 Iterator 将准备好返回序列中的第一个元素。
  2. 使用 next() 方法获得序列中的下一个元素。
  3. 使用 hasNext() 方法检查序列中是否还有元素。
  4. 使用 remove() 方法将迭代器最近返回的那个元素删除。

Iterator 还可以删除由 next() 生成的最后一个元素,这意味着在调用 remove() 之前必须先调用 next()

Iterator 的真正威力:能够将遍历序列的操作与该序列的底层结构分离。出于这个原因,我们有时会说:迭代器统一了对集合的访问方式

ListIterator

ListIterator 是一个更强大的 Iterator 子类型,它只能由各种 List 类生成。 Iterator 只能向前移动,而 ListIterator 可以双向移动。它还可以生成相对于迭代器在列表中指向的当前位置的后一个和前一个元素的索引,并且可以使用 set() 方法替换它访问过的最近一个元素。可以通过调用 listIterator() 方法来生成指向 List 开头处的 ListIterator ,还可以通过调用 listIterator(n) 创建一个一开始就指向列表索引号为 n 的元素处的 ListIterator 。

链表LinkedList

LinkedList 添加了一些方法,使其可以被用作栈、队列或双端队列(deque)

堆栈Stack

Java 1.0 中附带了一个 Stack 类,结果设计得很糟糕(为了向后兼容,我们永远坚持 Java 中的旧设计错误)。Java 6 添加了 ArrayDeque ,其中包含直接实现堆栈功能的方法。

队列Queue

队列是一个典型的“先进先出”(FIFO)集合。

LinkedList 实现了 Queue 接口,并且提供了一些方法以支持队列行为,因此 LinkedList 可以用作 Queue 的一种实现。

offer() 是与 Queue 相关的方法之一,它在允许的情况下,在队列的尾部插入一个元素,或者返回 false 。 peek() 和 element() 都返回队头元素而不删除它,但是如果队列为空,则 element() 抛出 NoSuchElementException ,而 peek() 返回 null 。 poll() 和 remove() 都删除并返回队头元素,但如果队列为空,poll() 返回 null ,而 remove() 抛出 NoSuchElementException 。

优先级队列PriorityQueue

先进先出(FIFO)描述了最典型的队列规则(queuing discipline)。队列规则是指在给定队列中的一组元素的情况下,确定下一个弹出队列的元素的规则。先进先出声明的是下一个弹出的元素应该是等待时间最长的元素。

Java 5 中添加了 PriorityQueue。

集合与迭代器

Collection 是所有序列集合共有的根接口。

生成 Iterator 是将序列与消费该序列的方法连接在一起耦合度最小的方式,并且与实现 Collection 相比,它在序列类上所施加的约束也少得多。

for-in和迭代器

Java 5 引入了一个名为 Iterable 的接口,该接口包含一个能够生成 Iterator 的 iterator() 方法。for-in 使用此 Iterable 接口来遍历序列。因此,如果创建了任何实现了 Iterable 的类,都可以将它用于 for-in 语句中。

for-in 语句适用于数组或其它任何 Iterable ,但这并不意味着数组肯定也是个 Iterable ,也不会发生任何自动装箱。

最新文章

  1. WebAPI IIS PUT和DELETE请求失败 405
  2. Ubuntu上Grafana 监控 Docker的技巧
  3. mysql 存储过程简介
  4. 关于IOS中UIWebView 加载HTML内容
  5. 配置nginx的负载均衡
  6. 77个常用Linux命令和工具
  7. 算法 《霍纳的方法java实践》
  8. Appium python自动化测试系列之移动自动化测试前提(一)
  9. JSON File Parse
  10. CNPM
  11. week7 ls
  12. app v2界面
  13. scrapy 自定义图片路径保存,并存到数据库中
  14. mongodb与mysql的区别与具体应用场景
  15. MapReduce经典入门小案例
  16. 51nod 1623 完美消除(数位DP)
  17. mysql查询更新时的锁表机制分析(只介绍了MYISAM)
  18. mysql表utf-8 字符串入库编码异常
  19. [C语言]小记q = (++j) + (++j) + (++j)的值
  20. Hadoop中Writable类

热门文章

  1. Python2和Python3中的rang()不同之点
  2. 16、前端知识点--Object.defineProperty 的用法+双向数据绑定原理解析
  3. 5.MCScanX 与circos下载、安装、运用
  4. selenium鼠标悬停失效,用js语句模拟
  5. 2018-10-16-weekly
  6. Solr从数据库导入数据(DIH)
  7. phpstorm 生产php pojo类
  8. 在 CentOS 上部署 GitLab (自托管的Git项目仓库)
  9. Java缓冲字符读取
  10. POJ 3259 Wormholes ( SPFA判断负环 &amp;&amp; 思维 )