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异常.

java集合(2)-Collection与Iterator接口的更多相关文章

  1. java集合 之 Collection和Iterator接口

    Collection是List,Queue和Set接口的父接口,该接口里定义的方法即可用于操作Set集合,也可以用于List和Queue集合.Collection接口里定义了如下操作元素的方法. bo ...

  2. Java集合【2】--iterator接口详解

    目录 一.iterator接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 3.2.1 SpitIte ...

  3. JAVASE(十四) 集合: 数组和集合、Collection、Iterator、List、Set、Map

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.数组和集合 1.1 内存中对数据进行存储和管理的“容器”:数组,集合 1.2 数组存储的特点和缺点 ...

  4. Java 集合系列18之 Iterator和Enumeration比较

    概要 这一章,我们对Iterator和Enumeration进行比较学习.内容包括:第1部分 Iterator和Enumeration区别第2部分 Iterator和Enumeration实例 转载请 ...

  5. Java集合框架Collection

    转自:http://www.cdtarena.com/javapx/201306/8891.html [plain] view plaincopyprint?01.在 Java2中,有一套设计优良的接 ...

  6. Java集合之Collection接口

    java的集合分为三大接口,分别是Collection,Map,Iterator,集合接口和类在java.util包中,此次主要介绍三大接口之一的Collection接口. 一些Collection允 ...

  7. Java API ——Collection集合类 & Iterator接口

    对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private St ...

  8. Java容器深入浅出之Collection与Iterator接口

    Java中用于保存对象的容器,除了数组,就是Collection和Map接口下的容器实现类了,包括用于迭代容器中对象的Iterator接口,构成了Java数据结构主体的集合体系.其中包括: 1. Co ...

  9. Java | 集合(Collection)和迭代器(Iterator)

    集合(Collection) 集合就是Java中提供的一种 空器,可以用来存储多个数据. 集合和数组都是一个容器,它们有什么区别呢? 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同一类型的 ...

随机推荐

  1. Tensor基本理论

    Tensor基本理论 深度学习框架使用Tensor来表示数据,在神经网络中传递的数据均为Tensor. Tensor可以将其理解为多维数组,其可以具有任意多的维度,不同Tensor可以有不同的数据类型 ...

  2. Ascend Pytorch算子功能验证

    Ascend Pytorch算子功能验证 编写测试用例 以add算子为例,测试脚本文件命名为:add_testcase.py.以下示例仅为一个简单的用例实现,具体算子的实现,需要根据算子定义进行完整的 ...

  3. A100 Tensor核心可加速HPC

    A100 Tensor核心可加速HPC HPC应用程序的性能需求正在迅速增长.众多科学研究领域的许多应用程序都依赖于双精度(FP64)计算. 为了满足HPC计算快速增长的计算需求,A100 GPU支持 ...

  4. 蓝牙mesh网络技术的亮点

    蓝牙mesh网络技术的亮点 The highlights of Bluetooth mesh networking technology 导言 蓝牙是当今最主要的低功耗无线技术之一,对无线设备用户和开 ...

  5. python 数据写入json文件时中文显示Unicode编码问题

    一.问题描述 import json dir = { '春晓':'asfffa', '春眠不觉晓' : '处处闻啼鸟', '夜来风雨声' : 56789, 'asdga':'asdasda' } fp ...

  6. NX二次开发-获取WCS坐标系的原点坐标和矩阵标识

    函数:UF_CSYS_ask_csys_info() 函数说明:获取工作坐标系对象的标识符. 用法: #include <uf.h> #include <uf_csys.h> ...

  7. 【NX二次开发】导出x_t、导入x_t例子,UF_PS_export_data、UF_PS_import_data

    获取blockUI 体收集器选择的体,导出x_t: std::vector<TaggedObject*>objects = bodySelect0->GetSelectedObjec ...

  8. C#关于数据库中存储的用户权限类似 "普通员工,管理员" 如何在代码中读取分析权限

    之前在看某些数据库的用户权限的表时,发现字段是这样类似这样存储的"  普通员工,管理员 ",当时觉得他们是通过分割字符串来分析权限的.后来读到 Liam Wang  的 https ...

  9. webpack(1)安装环境与解决环境问题

    前言 如果我们需要使用webpack,就需要依赖node环境 nvm node npm webpack@cli webpack nvm安装 nvm是一个用来管理node版本的工具.我们之所以需要使用n ...

  10. Innodb中有哪些锁?

    0.前言 上一篇从MySQL层面上了解锁,那么这篇我们从存储引擎上来了解, 以MySQL默认存储引擎Innodb来说,看看有哪些锁?(MySQL版本为8) 1.Shared and Exclusive ...