Java集合: 集合框架Collection和Map

Posted 喜欢吃西瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合: 集合框架Collection和Map相关的知识,希望对你有一定的参考价值。

集合设计的目标

在Java2之前,Java就提供了特设类。比如Dictionary,Vector,Stack,和Properties这些类用来存储和操作对象数组。
虽然这些类也很有用,但是它们缺少一个核心的主题。由于这个原因,使用Vector和Properties的操作方式有着很大的不同。
集合框架设计出来的目标是:

  • 框架必须是高性能的,基本集合(动态数组,链表,树,哈希表)的实现必须是高效的。
  • 该框架必须允许不同类型的集合,以类似的方式工作,具有高度的互操作性。
  • 对一个集合的扩展和适应必须是简单的。

就像所有对象都继承自Object类一样,Java的所有集合接口都是继承自Collection接口和Map接口。如下图所示,图片来自Java集合框架

在图中主要有四个部分。

  • 接口。代表了集合的抽象数据类型。之所以定义多个接口是为了以不同的方式操作集合对象。比如Collection,Set,List,Queue,Map等。
  • 抽象类。继承上述接口的抽象类,无法实例化,比如Abstrac tCollection,AbstractList,AbstractMap等。
  • 继承了抽象类的具体类。具体类不是直接实现接口的,而是实现了继承了接口的抽象类。比如ArrayList,LinkedList。
  • 工具类。比如Collections和Arrays。提供对集合对象的排序搜索等方法。注意区别Collections和Collection。

Collection接口

Collection接口继承自Iterable接口。它的方法如下,来自Java8手册。
其中removeIf,stream,spliterator,parallelStream是Java8所有的。

主要看一下iterator()方法,它在Iterable接口中声明。Iterable接口要求必须实现,返回实现Iterator对象的方法。比较拗口。(主要是要区别Iterator接口和Iterable接口)。也就是说,在具体类中需要以内部类的形式,去实现Iterator接口。并且重写其中的方法,分析ArrayList实现Collection接口再研究。
下面是Iterable接口内容。forEach和Spliterator是Java8的内容。

Iterator接口的内容。forEachRemaining是Java8的内容。

List接口

List代表一个元素有序,可重复的集合。由于List是有序集合因此增加了一些根据索引来操作集合元素的方法。
其中Java8中的方法有repalceAll,sort,和spliterator。

Queue接口

设计用于在处理之前容纳元素的集合。除了基本的“收集”操作外,队列还提供其他插入,提取和检查操作。这些方法中的每一种都以两种形式存在:一种在操作失败时引发异常,另一种返回特殊值(取决于操作,为null或false)。插入操作的后一种形式是专为与容量受限的Queue实现一起使用而设计的;在大多数实现中,插入操作不会失败。

Queue中有很多重复的方法。总结如下。
add/offer,element/peek,remove/poll中的三个方法均为重复的方法,在选择使用时不免有所疑惑。
1、add()和offer()区别:
add()和offer()都是向队列中添加一个元素。一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,调用 add() 方法就会抛出一个 unchecked 异常,而调用 offer() 方法会返回 false。因此就可以在程序中进行有效的判断!
2、poll()和remove()区别:
remove() 和 poll() 方法都是从队列中删除第一个元素。如果队列元素为空,调用remove() 的行为与 Collection 接口的版本相似会抛出异常,但是新的 poll() 方法在用空集合调用时只是返回 null。因此新的方法更适合容易出现异常条件的情况。
3、element() 和 peek() 区别:
element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。
下面是Queue的一些常用方法:
add 增加一个元索 如果队列已满,则抛出一个IIIegaIStateEeception异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null

Set接口

模拟了数学中的集的概念。不包含重复的元素,更准确的说是不包含e1,e2,e1.equals(e2),最多只包含一个null值。
Java8新增了spliterator方法。

Map接口

将键映射到值的对象。映射不能包含重复的键;每个键最多可以映射到一个值。该接口代替了Dictionary类,后者是一个完全抽象的类,而不是一个接口。
Map界面提供了三个集合视图,这些视图允许将地图的内容视为一组键,一组值或一组键-值映射。映射的顺序定义为映射的集合视图上的迭代器返回其元素的顺序。
一些映射实现(例如TreeMap类)对其顺序做出特定的保证。其他的(例如HashMap类)则没有。

以上是关于Java集合: 集合框架Collection和Map的主要内容,如果未能解决你的问题,请参考以下文章

Java集合学习笔记

Java集合: 集合框架Collection和Map

JavaEE基础(十八)/集合

Java:集合,Collection接口框架图

java的集合框架

Java集合框架浅析