Java流程控制的陷阱——for循环和foreach循环的陷阱

5、for循环的陷阱

5、1 分号的问题

public class SemicolonRight {
	public static void main(String[] args) {
		for ( int j = 1 , i = 0 ; i < 5 && j < 20 ; i++ , j *=2 ) {
			System.out.println(i + "-->" + j);
		}
	}
}
输出结果为:
0-->1
1-->2
2-->4
3-->8
4-->16
       根据Java语言规范,for循环里有且只有两个分号作为分隔符。第一个分号之前的是初始化条件;两个分号中间的部分是一个返回boolean的逻辑表达式,当它返回true是for循环才会执行下一次循环;第二个分号之后的是循环迭代部分,每次循环结束后会执行循环迭代部分。
注意:for循环的初始化条件可以同时定义多个变量,但由于它只能接受一条语句,因此这两个变量的数据类型应该相同。

5、2 循环计数器的问题

public class CareForCount {
	public static void main(String[] args) {
		for ( int i = 0 ; i < 10 ; i ++ ) {
			System.out.println("i的值为:" + i);
			i *= 0.1;
		}
	}
}
       上面程序试图控制循环10次,但是编译、运行上面的程序会发现输出一遍 i的值为:0 ”,然后一直输出“i的值为:1”,并且是一个死循环。下面分析一下程序运行的过程:程序开始时i=0,程序输出 i的值为:0 ”,然后执行i*=0.1;,这行语句相当于i = (int)(i * 0.1);,得到的结果依然是i=0。执行完迭代条件后i=1,因此程序看到输出i的值为:1”,接下来执行i*=0.1;,这行代码使i再次变为0。以此类推,每次执行完循环体后i的值总是为0,执行完循环迭代部分之后i的值总是为1,因此这个程序就是一个死循环。
提示:尽量避免在循环体中改变循环计数器的值,如果循环体内需要根据访问修改循环计数器的值,则可以考虑额外定义一个新变量用来保存修改过的值。

5、3 浮点数作为循环计数器的问题

public class FloatCount {
	public static void main(String[] args) {
		final int START = 99999999;
		for ( float i = START ; i < START + 50 ; i ++ ) {
			System.out.println("i的值:" + i);
		}
	}
}
       编译并运行上面的程序,一直输出“i的值:1.0E9”,并且是一个死循环。导致这个结果的原因是:定义的START是一个int类型整数,而且数值还比较大,当程序把这个int类型整数赋给float类型变量时,float类型变量无法精确记录这个值,会导致精度丢失。

6、foreach循环的陷阱

       从Java5开始,Java增加了foreach循环用于遍历数组、集合的每个元素。使用foreach循环遍历数组和集合元素时, 无须获得数组和集合长度,也无须根据索引来访问数组元素和集合元素,foreach循环自动遍历数组和集合的每个元素。当使用foreach循环来迭代输出数组元素或集合元素时,系统将数组元素、集合元素的 副本传给循环计数器。由于foreach循环中的循环计数器本身并不是数组元素、集合元素,它只是一个中间变量, 临时保存了正在遍历的数组元素、集合元素,因此通常不要对循环变量进行赋值,虽然这种赋值在语法上是允许的,但是没有实际意义,而且容易引起错误。
import java.util.ArrayList;
import java.util.List;

public class ForEacheErrorTest {
	public static void main(String[] args) {
		List<String> books = new ArrayList<>();
		books.add("book1");
		books.add("book2");
		books.add("book3");
		for (String book : books) {
			book = "BOOK";
			System.out.println(book);
		}
		System.out.println(books);
	}
}
输出结果为:
BOOK
BOOK
BOOK
[book1, book2, book3]
注意:使用foreach循环迭代数组、集合时,循环计数器只是保存了当前正在遍历的数组元素、集合元素的值,并不是数组元素、集合元素本身,因此不要对foreach循环的循环计数器进行赋值。




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值