在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 中的一些常用方法,本章我们来看一下 Java 集合框架中的Collection 的迭代器 Iterator。

当我们创建完成集合后,怎么样从集合中取元素呢?Java 为我们提供了迭代器 Iterator 来帮我们实现,如下:

 import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; /**
* 遍历集合
* Collection 提供了统一的遍历集合元素的方式:迭代器模式
* Iterator iterator() 获取用于遍历当前集合的迭代器
* java.util.Iterator 是一个接口,规定了用于遍历集合元素的相关方法,
* 不同的集合提供了相应的实现类,
* 无需记住那些类的名字,只将他们当做 Iterator 即可
* <p>
* 遍历集合遵循:问,取,删的步骤,其中删除不是必须操作
*/
public class Main {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("one");
collection.add("two");
collection.add("three");
collection.add("four");
// 获取用于遍历当前集合的迭代器
Iterator iterator = collection.iterator();
/**
* boolean hasNext() 问的过程
* 该方法是判断集合中是否还有元素可以取出
*
* E next() 取的过程
* 获取集合中下一个元素
* */
while (iterator.hasNext()) {
String string = (String) iterator.next();
System.out.println(string); // one two three four
}
}
}

从上面的代码可以看出,我们可以通过迭代器 Iterator 来输出每一个元素,那如果我们想要删除其中一个元素呢,既然我们可以遍历出每个元素,那我们可不可以通过 equals 来判断,如果存在就通过之前讲的 remove 方法删除掉呢,如下:

 import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class Main {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("one");
collection.add("two");
collection.add("three");
collection.add("four");
// 获取用于遍历当前集合的迭代器
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
String string = (String) iterator.next();
if ("one".equals(string)) {
/**
* 在使用迭代器遍历集合时,不要使用集合的方法增删改查
* 否则会引发异常
* */
// collection.remove(string); // 编译器错误 Exception in thread "main" java.util.ConcurrentModificationException
iterator.remove(); // 可以直接调用 Iterator 自带的 remove 方法,相当于去一个删一个
}
}
System.out.println(collection); // [two, three, four]
}
}

我们在讲数组的时候,对数组进行过遍历操作,并且用到过 for each 方法,这个在集合中同样适用,如下:

 import java.util.ArrayList;
import java.util.Collection; /**
* JDK5.0 之后推出了一个新的特性
* 增强 for 循环,又叫做新循环,for each
* <p>
* 新循环不能代替传统循环,
* 作用仅仅是用来遍历集合或数组的
*/ public class Main {
public static void main(String[] args) {
String[] array = {"one", "two", "three", "four"};
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]); // one two three four
}
for (String string : array) {
System.out.println(string); // one two three four
} Collection collection = new ArrayList();
collection.add("one");
collection.add("two");
collection.add("three");
collection.add("four");
for (Object object : collection) {
String string = (String) object;
System.out.println(string); // one two three four
}
}
}

在上面的代码中,可以看出我们可以通过 for each 的形式输出 collection 集合,那可不可以通过 collection.remove() 进行删除呢,如下:

 import java.util.ArrayList;
import java.util.Collection; public class Main {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("one");
collection.add("two");
collection.add("three");
collection.add("four");
for (Object object : collection) {
String string = (String) object;
if("one".equals(string)){
/**
* 新循环并非新的语法,
* 新循环是编译器认可,而不是虚拟机认可
* 使用新循环遍历时,编译器会将它改为迭代器但是遍历
* 所以在使用新循环遍历集合时,不能通过集合的方法增删改查
* */
collection.remove(string); // 编译错误 Exception in thread "main" java.util.ConcurrentModificationException
}
}
}
}

新循环并不能实现我们想要的增删改查,我们可以简单低理解为旧瓶装新酒。

Java 从入门到进阶之路(二十二)的更多相关文章

  1. Java 从入门到进阶之路(十二)

    在之前的文章我们介绍了一下 Java 类的重写及与重载的区别,本章我们来看一下 Java 类的 private,static,final. 我们在之前引入 Java 类概念的时候是通过商场收银台来引入 ...

  2. Java 从入门到进阶之路(十八)

    在之前的文章我们介绍了一下 Java 中的正则表达式,本章我们来看一下 Java 中的 Object. 在日常生活中,任何事物我们都可以看做是一个对象,在编程中是同样的道理,在 Java 编程中其实更 ...

  3. Java 从入门到进阶之路(十)

    之前的文章我们介绍了一下 Java 中的引用型数组类型,接下来我们再来看一下 Java 中的继承. 继承的概念 继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类. 继承就是子类继 ...

  4. Java 从入门到进阶之路(十五)

    在之前的文章我们介绍了一下 Java 中的接口,本章我们来看一下 Java 中类的多态. 在日常生活中,很多意思并不是我们想要的意思,如下: 1.领导:“你这是什么意思?” 小明:“没什么意思,意思意 ...

  5. Java 从入门到进阶之路(十四)

    在之前的文章我们介绍了一下 Java 中的抽象类和抽象方法,本章我们来看一下 Java 中的接口. 在日常生活中,我们会接触到很多类似接口的问题,比如 USB 接口,我们在电脑上插鼠标,键盘,U盘的时 ...

  6. Java 从入门到进阶之路(十六)

    在之前的文章我们介绍了一下 Java 中类的多态,本章我们来看一下 Java 中类的内部类. 在 Java 中,内部类分为成员内部类和匿名内部类. 我们先来看一下成员内部类: 1.类中套类,外面的叫外 ...

  7. Java 从入门到进阶之路(十九)

    在之前的文章我们介绍了一下 Java 中的Object,本章我们来看一下 Java 中的包装类. 在 Java 中有八个基本类型:byte,short,int,long,float,double,ch ...

  8. Python 爬虫从入门到进阶之路(十二)

    之前的文章我们介绍了 re 模块和 lxml 模块来做爬虫,本章我们再来看一个 bs4 模块来做爬虫. 和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也 ...

  9. Vue 从入门到进阶之路(十二)

    之前的文章我们介绍了一下 vue 中插槽的使用,本章我们接着介绍一下 vue 中的作用域插槽. <!DOCTYPE html> <html lang="en"&g ...

  10. Java 从入门到进阶之路(二十)

    在之前的文章我们介绍了一下 Java 中的包装类,本章我们来看一下 Java 中的日期操作. 在我们日常编程中,日期使我们非常常用的一个操作,比如读写日期,输出日志等,那接下来我们就看一下 Java ...

随机推荐

  1. H3C NAPT配置举例

  2. H3C 用三层交换机实现VLAN间路由

  3. 从http到https--phpStudy2018

    0. 将SSL证书解压到以下目录,申请方式见 百度 Apache/cert/ 分别更名为 my_public.crt my.key my_chain.crt 1. phpStudy->其它选项菜 ...

  4. P1039 大规模间谍入侵

    题目描述 爱丽丝魔法王国成立10周年,于是决定矩形国庆大阅兵. 在国庆大阅兵期间,为了防止暗黑王国的间谍乔装成平民混入,需要对每一个进城的人做检测. 因为暗黑王国的人长得和爱丽丝魔法王国的人长得很像, ...

  5. 第3本:Visual Studio程序员箴言

    第3本:Visual Studio程序员箴言 Visual Studio 2010是我经常使用的程序开发工具,也知道VS中有大量的快捷键可以帮助提高效率,可惜就是不愿意记忆,最近在学vim的时候快速把 ...

  6. linux 在 1 MB 之下的 ISA 内存

    一个最著名的 I/O 内存区是在个人计算机上的 ISA 范围. 这是在 640 KB(0xA0000)和 1 MB(0x100000)之间的内存范围. 因此, 它正好出现于常规内存 RAM 中间. 这 ...

  7. GetDc函数与GetWindowDC函数的区别

    GetDc函数:用于获得hWnd参数所指定窗口的客户区域的一个设备环境 GetWindowDC函数:返回hWnd参数所指定的窗口的设备环境. 获得的设备环境覆盖了整个窗口(包括非客户区),例如标题栏. ...

  8. HDU - 1005 Number Sequence (矩阵快速幂)

    A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mo ...

  9. Libra和中国央行数字货币(DCEP)的对比

    最近偶然和朋友讨论起Libra,对Libra和央行的数字货币方案很感兴趣.梳理了阅读资料(参考见文末)和自己的思考,发知乎留个记录. Libra 是什么? 无国界货币 + 为全球数十亿人服务的金融基础 ...

  10. 阿里云“网红&quot;运维工程师白金:做一个平凡的圆梦人

    他是阿里云的一位 P8 运维专家,却很有野心得给自己取花名“辟拾(P10)”:他没有华丽的履历,仅凭着 26 年的热爱与坚持,一步一个脚印踏出了属于自己的技术逆袭之路:他爱好清奇,练就了能在 20 秒 ...