zoukankan      html  css  js  c++  java
  • 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类)则没有。

  • 相关阅读:
    excel批量导入后 数据库校验存储过程
    编译内核时覆盖KBUILD_BUILD_USER和KBUILD_BUILD_HOST
    EDID真实数据块,请参考标准文档仔细核对
    RK30SDK开发板驱动分析(二):DDR频率配置
    Linux中的固件加载例子
    Android中如何禁止音量调节至静音
    C++中内部类访问外部类的私有成员
    DSD, DFF, DSF, DST概念解析
    Android中播放DSD音乐
    Linux系统调用分析
  • 原文地址:https://www.cnblogs.com/zuotongbin/p/11826767.html
Copyright © 2011-2022 走看看