zoukankan      html  css  js  c++  java
  • java集合(2)-Collection与Iterator接口

     1 package com.j1803.collectionOfIterator;
     2 import java.util.ArrayList;
     3 import java.util.Collection;
     4 import java.util.HashSet;
     5 public class CollectionTest {
     6     public static void main(String[] args) {
     7         Collection c1=new ArrayList();
     8         //添加元素
     9         c1.add(6);//虽然集合中不能放基本类型的值,但是Java支持自动装箱
    10         c1.add("孙悟空");
    11         c1.add("唐僧");
    12         System.out.println("输出c1的长度:"+c1.size());
    13         System.out.println("输出c1的集合元素:"+c1);
    14         //删除指定元素
    15         c1.remove("唐僧");
    16         System.out.println("输出c1的集合元素:"+c1);
    17         //判断集合c1是否包含指定元素
    18         System.out.println(c1.contains("孙悟空"));
    19         c1.add("沙僧");
    20         c1.add("PHP");
    21         System.out.println(c1);
    22 
    23         Collection books=new HashSet();
    24         books.add("PHP");
    25         books.add("Java");
    26         books.add("C++");
    27 
    28         //c1集合中是否包含books集合
    29         System.out.println("c1集合中是否包含books集合"+c1.containsAll(books));
    30         //用c1集合减去books集合
    31         c1.removeAll(books);
    32         System.out.println("用c1集合减去books集合"+c1);
    33     }
    34 }
    answer:
    输出c1的长度:3
    输出c1的集合元素:[6, 孙悟空, 唐僧]
    输出c1的集合元素:[6, 孙悟空]
    true
    [6, 孙悟空, 沙僧, PHP]
    c1集合中是否包含books集合false
    用c1集合减去books集合[6, 孙悟空, 沙僧]

    Process finished with exit code 0

    使用Java8增强的Iterator遍历集合元素.

    Iterator接口也是Java集合框架的成员,但它与Collection系列,Map系列的集合不一样:Collection系类集合,Map系列集合主要用于转其他对象,而Iterator则主要用于遍历(也就是迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器.

    Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口.Iterator接口里定义了如下四个方法

    boolean hasNext();如果被迭代的集合元素还没有被遍历完,则返回true.

    Object next();返回集合里的下一个元素.

    void remove();删除集合里上一次next方法返回的元素.

    void forEachRemaining(Consumer action);这是Java8为Iterator新增的默认方法,该方法可使用Lambda表达式来遍历集合元素.

    示例代码

    package com.j1803.collectionOfIterator;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    public class IteratorTest {
        public static void main(String[] args) {
            //创建集合books
            Collection books=new HashSet();
            books.add("PHP");
            books.add("C++");
            books.add("C");
            books.add("Java");
            books.add("Python");
            //创建集合books的迭代器
            Iterator iterator=books.iterator();
            while(iterator.hasNext()){
                //iterator.next()返回值都是Object型,需要强制类型转换
                String book=(String)iterator.next();
                System.out.println(book);
                if(book.equals("C++")){
                    //从集合中删除上一次next()方法返回值对象的元素.
                    iterator.remove();
                }
                //对遍历出来的元素重新赋值,不改变元素本身
                book="测试字符";
            }
            System.out.println(books);
    
        }
    }
    com.j1803.collectionOfIterator.IteratorTest
    Java
    C++
    C
    PHP
    Python
    [Java, C, PHP, Python]
    Process finished with exit code 0

    Iterator仅仅用于遍历集合,Iterator本身并不提供盛装对象的能力.如果需要来创建Iterator对象,必须要有一个被迭代的集合.没有集合的Iterator没有存在价值.

    当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有影响.

    当使用Iterator进行迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove()方法删除上一次next()方法返回的集合元素才可以;否则将会引发java.util.ConcurrentModificationException异常

    package com.j1803.collectionOfIterator;
    import java.util.Collection;
    import java.util.HashSet;
    import java.util.Iterator;
    public class IteratorTest {
        public static void main(String[] args) {
            //创建集合books
            Collection books=new HashSet();
            books.add("PHP");
            books.add("C++");
            books.add("C");
            books.add("Java");
            books.add("Python");
            //创建集合books的迭代器
            Iterator iterator=books.iterator();
            while(iterator.hasNext()){
                //iterator.next()返回值都是Object型,需要强制类型转换
                String book=(String)iterator.next();
                System.out.println(book);
                if(book.equals("C++")){
                    //从集合中删除上一次next()方法返回值对象的元素.
                    iterator.remove();
                    //使用Iterator迭代过程中,不可修改集合元素,下面的代码引发异常
                    books.remove("PHP");
                }
                //对遍历出来的元素重新赋值,不改变元素本身
                book="测试字符";
            }
            System.out.println(books);
    
        }
    }
    Java
    Exception in thread "main" java.util.ConcurrentModificationException
    C++
        at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
        at java.util.HashMap$KeyIterator.next(HashMap.java:1461)
        at com.j1803.collectionOfIterator.IteratorTest.main(IteratorTest.java:18)

    Process finished with exit code 1


    上面程序中标识位于Iterator迭代块内,也就是Iterator迭代Collection集合过程中修改了Collection集合,所以程序运行时引发异常.

    Iterator迭代器采用的是快速迭代(fail-fast)机制,一旦在迭代过程中检测到了该集合已经被修改过了(通过程序的其他线程)程序就会立即引发ConcurrentModificationException异常,而不是显示修改后的结果,这样可以避免共享资源而引发的潜在问题.

    使用foreach循环遍历集合元素

    除了可以使用Iterator接口迭代访问Collection集合里的元素之外,使用Java5提供的foreach循环迭代访问集合元素更加便捷

    代码示例

    
    
    package com.j1803.collectionOfIterator;
    import java.util.Collection;
    import java.util.HashSet;
    public class IteratorTest {
    public static void main(String[] args) {
    //创建集合books
    Collection books=new HashSet();
    books.add("PHP");
    books.add("C++");
    books.add("C");
    books.add("Java");
    books.add("Python");
    for (Object obj:books) {
    //此处的book变量也不是集合元素本身.
    String book=(String)obj;
    System.out.println(book);
    if(book.equals("PHP")) {
    //下面代码将会引发ConcurrentModificationException异常
    //books.remove("C++");
    //book值没有改变
    //book="hellow";
    }
    }
    System.out.println(books);

    }
    }

    Java
    C++
    C
    PHP
    Python
    [Java, C++, C, PHP, Python]

    Process finished with exit code 0
    
    

    使用foreach循环中的迭代变量也不是集合元素,系统只是依次把集合元素的值赋给迭代变量,因此在foreach循环中修改变量的值也没有任何意义.

    同样,当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则将引发ConcurrentModiFicationException异常.

  • 相关阅读:
    最短路详解
    树状数组基础
    并查集初步
    python shell的交互模式和文本编辑模式
    基于python的selenium自动化测试环境搭建
    Nagios基本搭建
    mysql错误代码对照表较完整
    搭建phpMyAdmin
    Cent OS 7 搭建MySQL
    详解封装源码包成RPM包
  • 原文地址:https://www.cnblogs.com/shadow-shine/p/9696766.html
Copyright © 2011-2022 走看看