zoukankan      html  css  js  c++  java
  • 理解java容器:iterator与collection,容器的起源

  • iterator与collection:容器的起源
    • iterator的简要介绍
    • Collection的简要介绍
      • 基本特性
      • 方法
        关于容器

        java中有许多有用的容器,比如说Set,广泛使用的ArrayList,这些容器使用的非常广泛
        所有这些容器都是直接或间接源于一个接口:Collection
        (不是Collections)

        iterator与collection:容器的起源

        容器是java的一个非常重要的组成部分,几乎处处都会用到。

        iterator的简要介绍

        java当中有两个与容器迭代有关的接口,iterable与iterator,这两个接口实现了容器中的迭代功能。从《java编程思想》p459中的容器继承关系图中可以看出:

        Iterator是所有容器的基础。
        可以这样来考虑:java中的容器,包括set,list,map等等,其最基本的属性就是可迭代,先实现了迭代的接口,然后才根据各自的功能进行补全。

        iterable

        iterable顾名思义,就是表示实现了这个接口的类都是可迭代的,iterable的主要用处就是提供类型的iterator,以及使任何实现了这个接口的类都能够使用forEach语句进行迭代
        iterable的官方文档如下:
        https://docs.oracle.com/javase/9/docs/api/java/lang/Iterable.html

        iterator

        iterator就是容器的迭代器,容器对我们封装了内部实现,作为补偿,每种容器都可以通过其内部的迭代器进行迭代。
        iterator的官方文档如下:
        https://docs.oracle.com/javase/9/docs/api/java/util/Iterator.html

        iterator接口中提供了四个方法,分别是:

        default void forEachRemaining(consumer<? super E> action);
        

        (我也不知道这个方法的具体含义)

        以及

        Boolean hasNext();
        E next();
        default void remove();
        

        这三个方法就是我们常用来对容器进行迭代的了。
        其中hasNext() 就是判断是否还有剩余元素没有被迭代访问,而next()方法就是返回当前的迭代器所指向的位置的接下来一个元素的引用。
        第三个方法remove()需要注意
        这个方法是将next()所指向的元素移除,对每一个next()指向,只能调用一次这个方法

        关于remove方法

        如果一个正在迭代中的collection通过除remove方法之外的途径被修改了,那么一个iterator的行为是未定义的,可能会产生许多匪夷所思的结果。除非子类覆盖了这个方法并给出了确定的行为。
        同样的,如果在使用了forEachRemaining方法之后调用remove方法,其结果也是未定义的

        Collection的简要介绍

        源代码中对collection的定义是这样的:

        public interface Collection<E> extends Iterable<E>
        

        iterator是容器的最基本最抽象的性质——可迭代
        而collection则对其稍微具体地完善了一下:collection代表了一组可迭代的对象
        在collection接口没有给出其它具体的要求,所以一个collection可以有各种不同的实现方式,比如说set与list就是两种不同的实现,能够分别满足不同的功能要求。
        collection的官方文档如下:
        https://docs.oracle.com/javase/9/docs/api/java/util/Collection.html

        基本特性

        • 所有对collection的实现都必须至少包含两种构造方法:一种不包含参数,直接创建一个空的对象。而另一种则含有一个collection类型的参数,该构造方法创建一个对象,并将参数的collection内的对象全都拷贝进来。对于这一点,没有任何强制性的限定,如果要亲自写一个新的collection的话,要不要实现这两种构造器全看程序员的心情
        • collection中包含可选操作,具体描述可以参考《java编程思想》-17.4-可选操作,简要来说,就是在对collection的implements中,可以不用实现所有的方法,比如说remove,是可以不要的,如果不嫌麻烦的话
        • collection的implement有时候会对其内部的元素进行限定,比如说不能为null,或者不能含有重复元素

        方法

        虽然java没有对collection接口的具体形式作出任何限制,但是通过接口里面的一大堆方法,可以知道一个collection所至少需要具备的功能:
        (只列举了一部分)

        • int size() 返回collection中的元素个数
        • boolean isEmpty() 是否为空
        • boolean contains(Object o) 是否包含o对象
        • boolean containsAll(Collection<?> c) 是否包含c collection中的所有对象
        • Iterator iterator() 返回为该collection量身定制的迭代器
        • Object[] toArray() 将collection转化为一个对象的数组
        • boolean add(E e) 添加一个e元素
        • boolean addAll(Collection<? Extends E> c) 添加一堆元素
        • boolean remove(Object o) 删除一个o对象
        • boolean removeAll(Collection<?> c) 删除一堆元素
        • void clear() 清空,让我们从头开始
        • boolean equals(Object o) 关于等价的判断
        • int hashCode() 返回哈希值
查看全文
  • 相关阅读:
    Java 泛型,你了解类型擦除吗?
    终于有人把 Nginx 说清楚了,图文详解!
    给你一份超详细 Spring Boot 知识清单
    Java 中的 SPI 机制是什么鬼?
    用 Git 和 Github 提高效率的 10 个技巧!
    聊聊微服务架构及分布式事务解决方案!
    python多线程同步机制Lock
    python多线程同步机制Semaphore
    mysql 慢查询时间
    mysql row模式查看原始sql
  • 原文地址:https://www.cnblogs.com/giere/p/li-jiejava-rong-qiiterator-yucollection-rong-qi-de.html
  • Copyright © 2011-2022 走看看