java集合框架中的map_Java集合(一): 集合框架Collection和Map

集合设计的目标

在Java2之前,Java就提供了特设类。比如Dictionary,Vector,Stack,和Properties这些类用来存储和操作对象数组。

虽然这些类也很有用,但是它们缺少一个核心的主题。由于这个原因,使用Vector和Properties的操作方式有着很大的不同。

集合框架设计出来的目标是:

框架必须是高性能的,基本集合(动态数组,链表,树,哈希表)的实现必须是高效的。

该框架必须允许不同类型的集合,以类似的方式工作,具有高度的互操作性。

对一个集合的扩展和适应必须是简单的。

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

23184abd5c94b607ba7ef8ed4503fce5.png

在图中主要有四个部分。

接口。代表了集合的抽象数据类型。之所以定义多个接口是为了以不同的方式操作集合对象。比如Collection,Set,List,Queue,Map等。

抽象类。继承上述接口的抽象类,无法实例化,比如Abstrac tCollection,AbstractList,AbstractMap等。

继承了抽象类的具体类。具体类不是直接实现接口的,而是实现了继承了接口的抽象类。比如ArrayList,LinkedList。

工具类。比如Collections和Arrays。提供对集合对象的排序搜索等方法。注意区别Collections和Collection。

Collection接口

Collection接口继承自Iterable接口。它的方法如下,来自Java8手册。

其中removeIf,stream,spliterator,parallelStream是Java8所有的。

1f2080e2cf424e9d0f61550a6d43d6ff.png

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

下面是Iterable接口内容。forEach和Spliterator是Java8的内容。

83d5b5f0cfa66412cc7dde759b839910.png

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

2f8a8d482c9b24fa3882d5eb911ba14e.png

List接口

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

其中Java8中的方法有repalceAll,sort,和spliterator。

1893f14e3748345e7743b45d838028f1.png

26fb3bf3507f87480e27b71d92b93211.png

Queue接口

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

67db9cf826c6ca452714fb1961f3ed6b.png

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方法。

bbfb62273ba10a0504c564fe1dddb720.png

Map接口

将键映射到值的对象。映射不能包含重复的键;每个键最多可以映射到一个值。该接口代替了Dictionary类,后者是一个完全抽象的类,而不是一个接口。

Map界面提供了三个集合视图,这些视图允许将地图的内容视为一组键,一组值或一组键-值映射。映射的顺序定义为映射的集合视图上的迭代器返回其元素的顺序。

一些映射实现(例如TreeMap类)对其顺序做出特定的保证。其他的(例如HashMap类)则没有。

848afc53e1d8d6bcc7a5c5b983ab6261.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值