我是靠谱客的博主 标致眼睛,最近开发中收集的这篇文章主要介绍[Java] 数据结构与算法分析 |Collection接口与iterator接口|Collection中的remove()与iterator中remove()的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

1.Collection的接口结构

2.Collection接口中常用的方法

 3.collection中的remove方法和collection下的iterator下的remove方法有没有什么异同呢?


1.Collection的接口结构

collection的图如下所示:

collection接口从其源码中可以得知:collection继承了Iterable接口

public interface Collection<E> extends Iterable<E>

iterable接口中的方法有

Iterator<T> iterator();
default void forEach(Consumer<? super T> action);
default Spliterator<T> spliterator()

 其中的iterator有如下方法实现

2.Collection接口中常用的方法

    • booleanadd(E e)

      确保此集合包含指定的元素(可选操作)。

      booleanaddAll(Collection<? extends E> c)

      将指定集合中的所有元素添加到这个集合(可选操作)。

      voidclear()

      从这个集合中移除所有的元素(可选操作)。

      booleancontains(Object o)

      返回 true如果集合包含指定元素。

      booleancontainsAll(Collection<?> c)

      返回 true如果这个集合包含指定集合的所有元素。

      booleanequals(Object o)

      将指定的对象与此集合进行比较,以进行相等性。

      inthashCode()

      返回此集合的哈希代码值。

      booleanisEmpty()

      返回 true如果集合不包含任何元素。

      Iterator<E>iterator()

      返回此集合中的元素的迭代器。

      default Stream<E>parallelStream()

      返回一个可能并行 Stream与集合的来源。

      booleanremove(Object o)

      从这个集合中移除指定元素的一个实例,如果它是存在的(可选操作)。

      booleanremoveAll(Collection<?> c)

      删除此集合中包含的所有元素(可选操作)的所有元素(可选操作)。

也就是说,通过Collection接口可以实现对集合的add,remove,isEmpty等操作,并且可以使用迭代器iterator实现对集合的迭代输出,移除;具体如下所示;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * @Author jangkeo
 * @Date 2021/8/13 12:47
 * @Version 1.0
 * @Explain : Collection
 * package: rt.jar ->java ->util->Collection
 */
public class CollectionT1 {

    public static void main(String[] args) {
        Collection collection = new ArrayList<>();
        Collection collection1 = new ArrayList<>();
        collection.add("a");
        collection.add("b");
        collection.add("c");
        collection.add("d");
        collection.add("e");
        collection1.add("u");
        int size = collection.size();
        //collection.clear();
        //System.out.println(collection.contains("a"));  //判断是否含有“a”
        //System.out.println(collection.hashCode());
        //System.out.println(collection.isEmpty()); //判断是否为空
        System.out.println(collection.remove("a")); //把“a"移除
        System.out.println(collection);
       // System.out.println(collection.addAll(collection1));//把collection1中的元素添加到collection的尾端
       // System.out.println(collection.retainAll(collection1)); //只要retainAll函数里面的 collection1 ,其他都不要
        System.out.println(size);
        System.out.println(collection);
        //System.out.println(collection.removeAll(collection)); //是否全部清除collection中的内容 是则返回true
        //System.out.println(collection);
    //    ------------------迭代器 Iterator 的使用
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()){
            String str = (String) iterator.next();  //不破坏迭代器的结构且成功删除c
            if (str.equals("c")) {
                iterator.remove();
                //collection.remove("c");
            }else
            {
                System.out.println(str);
            }
        }
        System.out.println(collection);

    }
}

 3.collection中的remove方法和collection下的iterator下的remove方法有没有什么异同呢?

基本的作用,remove,移除一个元素;

不同的是,collection 移除成功是返回boolean值;

    • booleanremove(Object o)

      从这个集合中移除指定元素的一个实例,如果它是存在的(可选操作)。

而iterator下的remove方法没有返回值;删了就是删了;

 那能不能一起用呢?在迭代器中使用该方法显然不行,具体如下;

(1)举个例子,当使用迭代器iterator时,集合中有a,b,c,d,e;

希望在遍历的时候,如果集合里面有c这个元素,将其移除,结果显示为a,b,d,e

 (**)

具体实现如下;

Iterator iterator = collection.iterator();
        while (iterator.hasNext()){
            String str = (String) iterator.next();  //不破坏迭代器的结构且成功删除c
            if (str.equals("c")) {
                iterator.remove();
                //collection.remove("c");
            }else
            {
                System.out.println(str);
            }
        }
        System.out.println(collection);

其中使用的是iterator.remove方法,结果如上(**)所示 ;

(2)但是当使用collection.remove()直接删除时,即

    Iterator iterator = collection.iterator();
        while (iterator.hasNext()){
            String str = (String) iterator.next();  //不破坏迭代器的结构且成功删除c
            if (str.equals("c")) {
                //iterator.remove();
                collection.remove("c");
            }else
            {
                System.out.println(str);
            }
        }
        System.out.println(collection);

结果为 

在遍历到c时  直接截断,也就是说其确实也删了,但是就此停止了;

原因是,在使用迭代器进行遍历时,使用iterator.remove会进行状态的更新,保证迭代的正确;

但使用collection.remove会并未能正常更新状态,所以迭代失败;

以下是官方的文档说明:

从底层集合中移除此迭代器返回的最后一个元素(可选操作)。 每次调用next只能调用此方法一次。 如果在迭代正在进行时以除调用此方法以外的任何方式修改了基础集合(比如使用了collection.remove(),该括号内为另外添加,其余为官方文档指定),则迭代器的行为是未指定的。

[总结]:在使用迭代器时,使用iterator.remove()方法;在其他地方使用collection.remove()方法; 

[参考文献]:

[1] 《数据结构与算法分析-Java版 第三版》

[2] https://blog.csdn.net/hqqkkc/article/details/108753890?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162883637116780269832326%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162883637116780269832326&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-108753890.first_rank_v2_pc_rank_v29&utm_term=iterator%E4%B8%AD%E7%9A%84remove%E6%96%B9%E6%B3%95&spm=1018.2226.3001.4187

[3] https://blog.csdn.net/qq_30310607/article/details/82347807?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162883637116780269832326%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162883637116780269832326&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-82347807.first_rank_v2_pc_rank_v29&utm_term=iterator%E4%B8%AD%E7%9A%84remove%E6%96%B9%E6%B3%95&spm=1018.2226.3001.4187

最后

以上就是标致眼睛为你收集整理的[Java] 数据结构与算法分析 |Collection接口与iterator接口|Collection中的remove()与iterator中remove()的区别的全部内容,希望文章能够帮你解决[Java] 数据结构与算法分析 |Collection接口与iterator接口|Collection中的remove()与iterator中remove()的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部