`

Java中for-each循环优先于传统for循环

阅读更多
Java中for-each循环优先于传统for循环
July 11, 2010 | tags Java  通用程序设计   | views 43Comments 0 在jdk1.5以前,我们可以用以下方式遍历集合(迭代器方式):


view sourceprint?1.for(Iterator i = c.iterator(); i.hasNext();) {
2.   
doSomething(i.next());
3.}用以下方式遍历数组(索引方式):
view sourceprint?1.for (int i = 0; i < a.length; i++) {
2.   
doSomething(a[i]);
3.}迭代器和索引下标变量在循环中出现了三次,这自然就增加了出错的可能性。


从jdk1.5开始Java引入了for-each循环,通过完全地隐藏迭代器和索引变量,避免了混乱和出错的可能。这种模式同时适用于集合和数组:


view sourceprint?1.for(Element e : elements) {
2.   
doSomething(e);
3.}利用for-each循环不会有性能损失,实际上,在某些情况下,比起普通的for循环,它还稍有优势,因为它对数组索引的边界值只计算一次(上边那个索引遍历数组的例子中就计算了a.lenght次)。


在对多个集合进行嵌套遍历时,for-each循环的优势更明显。下面的例子是对遍历扑克牌的每张牌(有bug):


view sourceprint?01.//四种花色
02.enum Suit{CLUB,DIAMOND,HEART,SPADE}
03.//13张牌
04.enum Rank{ACE,DEUCE,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,JACK,QUEEN,KING}
05.Collection<Suit> suits = Arrays.asList(Suit.values());
06.Collection<Rank> ranks = Arrays.asList(Rank.values());
07....
08.List<Card> cards = new ArrayList<Card>();
09.for (Iterator<Suit> i = suits.iterator(); i.hasNext(); ) {
10.   
for(Iterator<Rank> j = ranks.iterator(); j.hasNext(); ) {
11.       
cards.add(new Card(i.next(), j.next()));
12.   
}
13.}如果你在机器上运行这段程序,会报NoSuchElementException异常,因为调用调用了太多次i.next(),而四次之后已经用完了所有花色,而这时j.next()也只调用了四次,这显然不是我们想要的结果。


当然解决这个bug还是比较简单的,以下是一种ugly的方式:


view sourceprint?1.for (Iterator<Suit> i = suits.iterator(); i.hasNext();) {
2.   
Suit suit = i.next();
3.   
for (Iterator<Rank> j = ranks.iterator(); j.hasNext();) {
4.       
cards.add(new Card(suit, j.next()));
5.   
}
6.}

既然上面的方式ugly,那优雅的方式是什么呢,就是今天传说中的for-each循环:


view sourceprint?1.for (Suit suit : suits) {
2.   
for (Rank rank : ranks) {
3.       
cards.add(new Card(suit, rank));
4.   
}
5.}

OK,既然for-each这么优雅,那满足什么条件才可以使用for-each呢?实现了Iterable接口的对象都可以使用for-each循环。这个简单的接口由单个方法组成,下面就是这个接口的示例额:


view sourceprint?1.public interface Iterable<E> {
2.   
Iterator<E> iterator();
3.}实现Iterable接口并不难。如果你在变相的类型表示的一组元素,即使你选择不让它实现Collection,也要让它实现Iterable。这样可以允许用户利用for-each循环遍历你的类型,会令用户永远感激不尽的。


总之,for-each循环在简洁性和预防bug方面有着传统的for循环无法比拟的优势,并且没有性能损失,我们应该尽可能地使用for-each循环。不过,遗憾的是在以下三种情况下是不能使用for-each的:



1.过滤
如果要遍历集合,并删除选定的元素,就需要使用显势的迭代器,以便可以调用它的remove方法。


2.转换
如果需要遍历列表或者数组,并取代它部分或者全部的元素值,就需要列表迭代器或者数组索引,以便设定元素的值。


3.平行迭代
如果需要并行地遍历多个集合,就需要显式地控制迭代器和数组索引变量,以便所有的迭代器或者索引值变量都可以得到同步前移。




eg:
List<Case> caseLists = caseService.getDetailYzjByNo(caseBean
					.getCaseNo());
			for (Case caseinfo : caseLists) {
				if (caseinfo.getCaseTypeId() == 134
						&& caseBean.getCaseId() != caseinfo.getCaseId()) {
					request.setAttribute("LianBanCase", "LianBanCase");
					break;
				}
			}
分享到:
评论

相关推荐

    XYXDBP-WGP#Effective-Java#第58条:for-each循环优先于传统的for循环 f82c07ec4f6

    下面是用一个传统的for循环遍历集合的例子:用传统的for循环遍历数组的做法如下:这些做法逗比while循环更好,但是它们并不完美。如果真的那么不幸,并且外部集

    Java for-each循环使用难题2例(高级使用方法)

    由于for-each循环依赖于`Iterable`接口来获取迭代器,因此,尝试直接用for-each遍历这个类会导致编译错误,如`Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - for-each not ...

    详解JAVA中的for-each循环与迭代

    在Java编程语言中,`for-each`循环和迭代器是两种主要的遍历集合(如数组和集合)的方式。本文将深入探讨这两种方法,并强调它们的用途、优点以及潜在的陷阱。 首先,我们来看一下迭代器(Iterator)。迭代器是Java...

    java循环结构

    For-Each循环(也称为增强For循环)是Java 5引入的新特性,主要用于遍历集合或数组中的每个元素。其语法为: ```java for (类型 变量 : 集合/数组) { // 循环体 } ``` 假设`Demo4.java`演示了使用For-Each...

    第02章 Java编程基础 14 For循环

    除了基本形式,Java还支持更复杂的For循环结构,如For-Each循环(也称为增强For循环),它简化了遍历数组或集合的操作。For-Each循环的语法如下: ```java for (数据类型 变量 : 集合或数组) { // 循环体 } ``` ...

    Java循环语句之for共4页.pdf.zip

    Java 5引入了一种更简洁的循环方式,被称为for-each循环或增强型for循环,它主要用于遍历数组或集合。基本语法如下: ```java for (类型 变量 : 集合或数组) { // 循环体代码 } ``` 例如,遍历一个整数数组: ```...

    Java循环技巧大全

    #### 二、增强型For循环(For-Each循环) 增强型For循环是Java 5引入的一种新的循环机制,用于简化对数组或集合的操作。例如: ```java String[] arr = new String[]{"a", "b", "c"}; for (String s : arr) { ...

    Java for循环几种写法整理

    5. 并行for-each循环(Java 8+): 自Java 8起,可以使用`Parallel Streams`进行并行遍历,提高性能。例如: ```java IntStream.rangeClosed(1, 10).parallel().forEach(System.out::println); ``` 这将并行...

    JDK1.5中增强for循环

    在 Java 中,遍历数组或集合通常采用传统 for 循环。例如: 1. **遍历数组**: ```java int[] integers = {1, 2, 3, 4}; for (int j = 0; j ; j++) { int i = integers[j]; System.out.println(i); } ``` 2...

    java-for-loops-classwork-cmadisonne:GitHub Classroom创建的java-for-loops-classwork-cmadisonne

    Java for循环类For循环上的Java分配使用“ for”循环计数到100给定一个主要功能: int lastNumber = 100 ;System . out . println( " Starting Count to " + lastNumber);countTheNumbers(lastNumber); 创建一个...

    java代码-for循环注释

    Java 5引入了一种更简洁的循环方式,称为`for-each`循环,特别适用于遍历集合和数组。例如,遍历一个ArrayList: ```java List&lt;String&gt; list = new ArrayList(); list.add("Apple"); list.add("Banana"); list.add...

    java-for-loops-classwork-R3coTh3Cod3r:GitHub Classroom创建的java-for-loops-classwork-R3coTh3Cod3r

    Java for循环类For循环上的Java分配使用“ for”循环计数到100给定一个主要功能: int lastNumber = 100 ;System . out . println( " Starting Count to " + lastNumber);countTheNumbers(lastNumber); 创建一个...

    Java中使用增强for循环的实例方法

    Java语言中提供了多种循环语句,包括for循环、while循环、do-while循环等,其中增强for循环(也称为foreach循环)是一种特殊的for循环,用于遍历数组或集合中的元素。在本文中,我们将详细介绍Java中使用增强for循环...

    JAVA的高级新特性

    - For-Each循环,又称为增强型for循环,是从Java 5开始引入的。它的主要目的是简化对数组和集合的遍历。在传统的for循环中,我们需要手动初始化、递增和检查终止条件。而For-Each循环通过以下语法糖简化了这一过程...

    JDK新特性.doc

    此外,for-each循环不仅适用于数组,还适用于任何实现了`Iterable`接口的对象,比如集合类。例如,对于`ArrayList`,可以这样遍历: ```java ArrayList&lt;String&gt; list = new ArrayList(); list.add("Apple"); list....

    斗地主发牌

    在Java编程语言中,"斗地主发牌"是一个典型的示例,用于教授和实践基本的面向对象编程概念,如构造函数、对象数组以及for-each循环。斗地主是一种广受欢迎的扑克游戏,通常涉及三名玩家和一副54张牌的牌组。在这个...

    java代码-for循环练习

    在Java编程语言中,`for`循环是一种常用的控制流程结构,用于执行重复性的任务。它在许多场景下都非常实用,例如遍历数组、处理集合、进行条件迭代等。本实践项目旨在通过`for`循环的练习,提升对Java编程中循环控制...

    浅谈java 增强型的for循环 for each

    Java中的增强型for循环,又称为foreach循环,是自JDK 5.0引入的一种新的迭代方式,旨在简化对集合和数组的遍历操作。它通过简化语法,使得程序员可以更加专注于业务逻辑,而不必关心索引管理和迭代器的具体实现。 ...

    java面试问题-java基础相关.docx

    - **使用 `Iterator` 遍历**:在不支持 for-each 循环的旧版本 Java 中,或者需要更细粒度的控制时,可以使用 `Iterator` 来遍历 `entrySet()`、`keySet()` 或 `values()`。 在遍历 Map 时,需要注意以下几点: - ...

Global site tag (gtag.js) - Google Analytics