浏览以下内容前,请点击并阅读 声明

Queue接口(队列)

需要对一些列的元素进行处理前,我们可以把他们放到Queue对象中,除了继承Collection接口的方法外,队列还有一些插入,删除和检查操作,Queue接口定义如下:

public interface Queue<E> extends Collection<E> {
E element();
boolean offer(E e);
E peek();
E poll();
E remove();
}

所有的对列方法都包含由两种形式:(1)如果方法执行失败,则抛出异常(2)另外,如果执行失败,也可能返回一个特殊的值,可以是null 或者false,该接口通常的结构如下表所示:

操作类型 抛出异常 返回特殊值
插入 add(e) offer(e)
删除 remove() poll()
检查 element() peek()

队列一般以先进先出(FIFO)的顺序排列其元素,无论以什么顺序排列元素,其remove或者是poll方法都会移除并返回其排在开头的元素,所有实现Queue接口的类都要指定排序方式,remove和poll方法的唯一区别就在于当队列中不再含有元素的时候,remove方法会抛出NoSuchElementException,而poll返回null。

Queue接口的实现类可以限制元素的数量,比如在java.util.concurrent包中的Queue接口实现类就对元素的数量进行了限制,而java.util包中的Queue类则没有限制。

从Collection接口中继承的add方法被调用过后会向队列中添加一个元素,如果超过了队列元素数量最大的限制,就会抛出异常,offer方法只在限制元素数量的对列中使用,如果添加元素失败,则返回false而不会抛出异常。

element和peek方法都是返回队列中排在开头位置的元素,不会移除任何元素,element和peek的区别在于当队列中不再含有元素的时候,element方法会抛出NoSuchElementException,而peek返回null。

队列的实现类一般不允许插入null元素,LinkedList是例外,由于历史原因,他可以插入null元素,但最好不要使用这一特性,因为poll和peek方法执行失败时返回null。

队列一般不定义基于元素的equals方法和hashCode方法,而是继承的Object的基于统一性的方法。

Deque接口

Deque的发音与deck相同,它是一个两头队列,是一个支持从两端插入和移除元素的线性集合。Deque相较于Stack和Queue是一个功能更为丰富的抽象数据类型,因为它同时实现了Stack和Queue的方法,实现Deque接口的预定义类有ArrayDeque和LinkedList,Deque接口可以同时用作后进先出(LIFO)的Stack对象和先进先出(FIFO)的Queue对象,Deque的方法可以分为三类。

插入方法

addfirst方法和offerFirst方法将制定的元素插入Deque对象的最开始,而addLast和offerLast则将元素插入Deque对象的最后,当Deque的大小被限制时,Deque对象元素数量达到最大以后,使用addLast和addrFirst方法会抛出异常。

删除方法

removeFirst和pollFirst方法会移除Deque对象中的开始的元素,而removeLast和pollLast方法则会移除Deque对象中最后的元素,当Deque对象为空时,使用removeLast和removeFirst方法会抛出异常,而使用pollFirst和pollLast方法则会返回null。

检索元素

getFirst和peekFirst方法将会返回Deque对象中最开始的元素,而getLast和peekLast方法则返回Deque对象中最后的元素,使用这些方法不会对Deque对象造成影响,当Deque对象为空是,使用getFirst和getLast方法会抛出异常,而使用peekFirst和peekLast方法则返回null。

以上三类方法总结如下表:

操作类型 首个元素(Deque对象的开始) 最后一个元素 (Deque对象的结尾)
插入 addFirst(e)
offerFirst(e)
addLast(e)
offerLast(e)
删除 removeFirst()
pollFirst()
removeLast()
pollLast()
检索 getFirst()
peekFirst()
getLast()
peekLast()

除了上述的方法意外,Deque接口还定义了其他的方法,如removeFirstOccurence方法,作用是移除Deque对象中首次出现的指定对象,如果没有出现指定元素,则不会对该Deque对象产生影响,类似的还有removeLastOccurence等。

Map接口

一个Map对象是一个包含键-值对应关系的对象。一个map对象不能包含重复的键,而每一个键只能对应最多一个值,Map接口包含了一些基本操作的方法(如put, get, remove, containsKey, containsValue, size, 和 empty),批量操作方法(如putAll和clear)和集合视图操作(如keySet,entrySet和values)。

java平台含有三种通用的Map实现类,HashMap,TreeMap和LinkedHashMap,他们的性能和行为表现就如同Set和中的HashSet,TreeSet和LinkedHashSet三种实现类类似。

Map接口基本操作

Map的基本操作方法(如put, get, remove, containsKey, containsValue, size, 和 empty)和Hashtable类中的方法是一样的。

想Set和List接口一样,Map 接口加强了强化了equals和hashCode方法的要求,两个Map对象即使是不同的实现类型也能够进行等同性的比较,如果两个Map对象含有相同的键-值对应关系,则可视为相等。

一般情况下,所有的Map实现类都会提供一个参数为Map类型的参数,就像Collection接口一样,这样所有实现Map接口的类的实例都可以作为该构造器的参数,如下所示:

//假设对象m的类型是Map接口的实现类
Map<K, V> copy = new HashMap<K, V>(m);

Map接口的批量操作

Map接口的批量操作比较容易理解,putAll操作就如同Collection的addAll方法的效果一样,能够将一个Map对象的所有键-值对应关系复制到另外一个Map对象,另外putAll还有一个巧妙的用处,就是能够利用一个Map对象改写另外一个Map对象的键-值关系,如下例所示:

//该方法提供一个默认的Map对象,和一个改写的Map对象
static <K, V> Map<K, V> newAttributeMap(Map<K, V>defaults, Map<K, V> overrides) {
Map<K, V> result = new HashMap<K, V>(defaults);
//result中和overrides所共有的键-值关系将会被改写
result.putAll(overrides);
return result;
}

集合视图

以下三种集合视图方法能够把Map对象看做是一个集合对象 :

  1. keySet--由Map中的键对象组成的Set对象。
  2. values--由Map对象中的值对象组成的Collection对象,该Collection对象不是Set对象,因为可能由多个键对应同一个值。
  3. entrySet--由Map对象中所有的键-值映射组成的Set对象,Map接口提供了一个嵌套的Map.Entry接口,返回的Set类型是这个接口类型。

这些集合视图是迭代整个Map对象的唯一方法,有人担心每次调用集合视图的方法,都会产生一个新的集合对象,从而降低性能,不必担心,因为每次调用集合视图方法都是返回的同一个对象,而没有创建新的对象,所有的java.util包中的Map实现都是采用这样的策略。对集合视图方法产生的集合对象进行增删操作也会影响到后台的Map对象,如果该Map对象支持增删操作的话。

Map.Entry中有一个setValue方法,如果Map对象支持值的更改的话,能够在迭代过程中更改值,注意这是在迭代过程中更改Map对象中值的唯一安全的方法,采用其他方法更改值会有不明确的后果。

集合视图支持以任何形式移除元素,如remove,removeAll,retainAll和clear,还有Iterator.remove(Map需要支持移除元素)。然而集合视图不支持任何形式的元素增加。

  获得了集合视图以后,集合的批量操作方法(removeAll,retainAll,containAll)便也可以使用,首先如果你想判断两个Map对象是否为包含关系时,可用如下代码实现

//判断m1是否包含m2
m1.entrySet().containsAll(m2.entrySet())
//判断m1和m2是否含有相同的键
m1.keySet().equals(m2.keySet())

一对多映射

Map中的键-值关系都是一个键只能对应一个值,然而还有一种情况是一个键对应多个值,然而这种情况并不多件,所以java集合框架内并没有包含这种映射。然而实现这种映射比较简单,就是将一个Map对象的值设为一个List对象就可以了。

java-集合3的更多相关文章

  1. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  2. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  3. java集合你了解多少?

    用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...

  4. 深入java集合学习1-集合框架浅析

    前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...

  5. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  6. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  7. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  8. Java 集合框架

    Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...

  9. Java集合概述

    容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...

  10. 深入java集合系列文章

    搞懂java的相关集合实现原理,对技术上有很大的提高,网上有一系列文章对java中的集合做了深入的分析, 先转载记录下 深入Java集合学习系列 Java 集合系列目录(Category) HashM ...

随机推荐

  1. C#成员函数直接调用和反射+委托的性能比较

    using System; using System.Reflection; using System.Diagnostics; namespace Refl { class Test { publi ...

  2. Python之路【第二十一篇】Django ORM详解

    ORM回顾 关系对象映射(Object Relational Mapping,简称ORM). django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 对于ORM框 ...

  3. [译]Atlassian Git系列教程

    国庆期间把Atlassian的Git系列教程看完了.边看边翻译了相关文章. 原教程: https://www.atlassian.com/git/tutorials/ 我翻译的: git init g ...

  4. tyvj1005 采药

    描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞 ...

  5. iPad版微信终于来临了 微信5.4版搜索更智能 转账就是发消息

    等待甚久的iPad版微信终于来临了!昨日微信iOS版本更新至5.4.0.16,新增功能包括搜索公众号.识别图中二维码.面对面收钱,同时适配iPad.(微信5.4安卓版重回ios风格 导航菜单都放底栏位 ...

  6. PHP正则表达式模式修饰符详解

    PHP模式修饰符又叫模式修正符,是在正则表达式的定界符之外使用.主要用来调整正则表达式的解释,提扩展了正则表达式在匹配.替换等操作的某些功能,增强了正则的能力.但是有很多地方的解释都是错误的,也容易误 ...

  7. HDU 5686 斐波那契数列、Java求大数

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=5686 当我们要求f[n]时,可以考虑为前n-1个1的情况有加了一个1. 此时有两种情况:当不适用第n个1进 ...

  8. PHPStorm XDebug的安装

    环境: 我的系统: 4.4.0-43-generic #63-Ubuntu SMP Wed Oct 12 13:48:03 UTC 2016 x86_64 x86_64 x86_64 GNU/Linu ...

  9. 创建GitHub博客

    1. 创建GitHub账号 GitHub技术博客首先需要GitHub账户,请在官网按照步骤自行注册账号. 2. 创建博客仓库 使用注册的账户登录,然后点击创建仓库,输入项目信息如下所示,注意项目名称规 ...

  10. 在VS中建立.aspx,.cs,.designer.cs之间的级联关系

    <Compile Include="..\Admin\Actions.aspx.cs"> <DependentUpon>Actions.aspx</D ...