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异常.
java集合(2)-Collection与Iterator接口的更多相关文章
- java集合 之 Collection和Iterator接口
Collection是List,Queue和Set接口的父接口,该接口里定义的方法即可用于操作Set集合,也可以用于List和Queue集合.Collection接口里定义了如下操作元素的方法. bo ...
- Java集合【2】--iterator接口详解
目录 一.iterator接口介绍 二.为什么需要iterator接口 三.iterator接口相关接口 3.1 ListIterator 3.2 SpitIterator 3.2.1 SpitIte ...
- JAVASE(十四) 集合: 数组和集合、Collection、Iterator、List、Set、Map
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.数组和集合 1.1 内存中对数据进行存储和管理的“容器”:数组,集合 1.2 数组存储的特点和缺点 ...
- Java 集合系列18之 Iterator和Enumeration比较
概要 这一章,我们对Iterator和Enumeration进行比较学习.内容包括:第1部分 Iterator和Enumeration区别第2部分 Iterator和Enumeration实例 转载请 ...
- Java集合框架Collection
转自:http://www.cdtarena.com/javapx/201306/8891.html [plain] view plaincopyprint?01.在 Java2中,有一套设计优良的接 ...
- Java集合之Collection接口
java的集合分为三大接口,分别是Collection,Map,Iterator,集合接口和类在java.util包中,此次主要介绍三大接口之一的Collection接口. 一些Collection允 ...
- Java API ——Collection集合类 & Iterator接口
对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private St ...
- Java容器深入浅出之Collection与Iterator接口
Java中用于保存对象的容器,除了数组,就是Collection和Map接口下的容器实现类了,包括用于迭代容器中对象的Iterator接口,构成了Java数据结构主体的集合体系.其中包括: 1. Co ...
- Java | 集合(Collection)和迭代器(Iterator)
集合(Collection) 集合就是Java中提供的一种 空器,可以用来存储多个数据. 集合和数组都是一个容器,它们有什么区别呢? 数组的长度是固定的,集合的长度是可变的. 数组中存储的是同一类型的 ...
随机推荐
- Tensor基本理论
Tensor基本理论 深度学习框架使用Tensor来表示数据,在神经网络中传递的数据均为Tensor. Tensor可以将其理解为多维数组,其可以具有任意多的维度,不同Tensor可以有不同的数据类型 ...
- 用OpenCV4实现图像的超分别率
用OpenCV4实现图像的超分别率 本实验原文链接:· https://arxiv.org/pdf/1807.06779.pdf 原文摘要 单图像超分辨率(SISR)的主要挑战是如何恢复微小纹理等高频 ...
- AI框架精要:设计思想
AI框架精要:设计思想 本文主要介绍飞桨paddle平台的底层设计思想,可以帮助用户理解飞桨paddle框架的运作过程,以便于在实际业务需求中,更好的完成模型代码编写与调试及飞桨paddle框架的二次 ...
- 如何安装/导入Arduino库文件及库文件的不同位置与区别(以eFLL中嵌入式模糊逻辑库为例)
网上有数百个可在Aruduino中使用的库,这些代码集使得我们无需从0-1地搭建我们所需功能,这使得学习和使用Arduino变得更加方便简单.除此之外,平时直接从网上download下的代码也很有可能 ...
- 【转】【NX二次开发】UFUN进度中断,单击停止可中断此操作
队长的博客: https://www.cnblogs.com/nxopen2018/p/13174207.html 显示此对话框,点击可中断操作: 用到的ufun函数: UF_ABORT_ask_fl ...
- 【VBA】获取文件夹下所有文本文件
源码: 1 Sub 获取文件夹下所有文本文件() 2 Dim strPath As String 3 strPath = "G:\A\" 4 Dim MyFile As Strin ...
- 从JDBC到ORM的事务实现
一.JDBC 早期SUN公司想编写一套可以连接天下所有数据库的API,但是当他们刚刚开始时就发现这是不可完成的任务,因为各个厂商的数据库服务器差异太大了.后来SUN开始与数据库厂商们讨论,最终得出的结 ...
- 痞子衡嵌入式:超级下载算法(RT-UFL)开发笔记番外(1) - JLinkScript妙用
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是超级下载算法开发笔记番外篇之JLinkScript妙用. JLinkScript 文件是配套 J-Link 调试器使用的脚本,这个脚本适 ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- Jetpack Compose和View的互操作性
Jetpack Compose Interoperability Compose风这么大, 对于已有项目使用新技术, 难免会担心兼容性. 对于Compose来说, 至少和View的结合是无缝的. (目 ...