Java的循环结构及嵌套循环

Java的循环结构

Java 总共有三种循环结构,分别是while、do…while、for。

while 循环结构

while 循环语法:

while(布尔表达式) {
	//功能语句
}

代码执行顺序:

  1. 判断小括号中的值是否为 true,如果为 true,执行功能语句。
  2. 执行完功能语句,继续判断小括号中的值,如果为 true,继续执行功能语句。
  3. 直到判断小括号中的值为 false,跳出循环。

do…while 循环结构

do…while 语法结构:

do {
    //功能语句
} while(布尔表达式);

代码执行顺序:

  1. 首先执行 do 结构体里面的功能代码一次。
  2. 第一次判断 while() 结果为 ture。
  3. 执行 do 循环体。
  4. 第二次判断 while() 结果为 ture。
  5. 执行 do 循环体。
  6. 第 n 次判断 while() 结果为 false 循环结束。

和while的区别:

  1. 语法结构上的区别。
  2. while 语句是先判断条件是否成立再执行语句,条件不符合后终止。do…while 是先执行语句再判断条件是否成立,条件不符合后终止。
  3. do…while 循环至少执行一次功能语句。

for 循环结构

for 语法结构:

for (循环初始化语句A; 循环判断语句B; 循环后语句D) {
	//功能语句C
}

执行顺序:

  1. 循环初始化语句A执行一次。
  2. B --> true ----> C ----> D。
  3. B --> true ----> C ----> D。
  4. B --> false,循环结束。

特点:

  1. for ( ; ; ) {不加功能语句},死循环。
  2. for ( ; ; ) 后直接跟功能语句(1句)死循环。
  3. for ( ; ; ) 后跟两句功能语句,第二句报错,for 无法访问的语句。

注意事项:

  • for (int i = 1; i <= 10; i++) 时 i 是属于该结构体内的变量,外部无法访问。

Java的嵌套循环

概念

循环嵌套,循环里面还有循环,可以嵌套多层,不同的循环结构相互之间也可以嵌套。

例如:

//控制打印行数
for(int i = 1;i<=5;i++){   
	for(int k = 1; k <= 5 - i; k++) {
		//控制打印一行的内容
		System.out.print(" ");
	}
	for(int j = 1; j <= i; j++) {
		//控制打印一行的内容
		System.out.print("* ");
	}
	System.out.println(); 
}

建议:
实际开发中不要嵌套太深,一般情况下嵌套一次足以。

循环控制语句

break

特点:

  1. 循环结构结束不等于方法结束,for 循环结构体后面的语句还会正常运行
  2. break 只是终止当层循环:
  3. 如果在内层想要终止外层循环:可以给外层循环取一个别名,然后使用break 名字;结束外层循环。

例如:

class BreakTest {
    public static void main(String[] args) {
          test:for(int i = 0; i <= 5; i++) {
              System.out.println(i);
              for(int j = 0; j <= 5; j++) {
                if(j == 3) {
					break test;
				}
			}
		} 
	}
}

continue

特点: 跳过当层当次循环,继续下一次循环

return

特点: 在循环中使用时结束方法,表示结束当前的方法

注意事项:
break、coutinue、return,后面都不能写语句。编译会报错:访问不到。

foreach 循环

foreach 语句是 Java1.5 的新特征之一,在遍历数组、集合方面,foreach 为开发人员提供了极大的方便。
foreach 语句是 for 语句的特殊简化版本,但是 foreach 语句并不能完全取代for语句,然而,所有的 foreach 语句都可以改写为 for 语句版本。
foreach 并不是一个关键字,习惯上将这种特殊的 for 语句格式称之为“foreach”语句。
foreach的语句格式:

for(元素类型t 元素变量x : 遍历对象obj) {
	//引用了 x 的 java 语句;
}

foreach 相对于 for 循环,代码减少了,但是 foreach 依赖 IEnumerable(IEnumerable是一个接口,它定义一个方法 GetEnumerator,它返回一个 IEnumerator 接口,这允许只读访问一个集合,然后实现 IEnumerable 的集合可以与 foreach 语句一起使用)接口。在运行的时候效率低于普通 for 循环。当然了,在处理不确定循环次数的循环,或者循环次数需要计算的情况下,使用 foreach 比较方便。而且 foreach 的代码经过编译系统的优化后,和 for 循环的循环类似。可以说,foreach 语句是 for 语句的特殊简化版本,在遍历数组、集合方面,foreach 为开发人员提供了极大的方便。在进行复杂的循环设计时,还是应该使用 for 循环。

使用场景:

  • 如果只是遍历集合或者数组,用 foreach 好些,快些。
  • 如果对集合中的值进行修改,并且确定循环次数就要用 for 循环了。

Java8集合自带的foreach以及流的foreach

Iterable接口中的默认实现:

default void forEach(Consumer<? super T> action) {  
  Objects.requireNonNull(action);                        
    for (T t : this) {        
      action.accept(t);    
    } 
}

Java8流使用 foreach 打印所有的偶数示例:

ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
list.stream()
  .filter(n -> n % 2 == 0)
  .forEach(System.out::println);

使用集合的 foreach 迭代所有元素并打印示例:

ArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
list.forEach(System.out::println);

使用 foreach 迭代Map:

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);
	
// 1.Map entries
map.entrySet().forEach(System.out::println);

// 2.Map keys
map.keySet().forEach(System.out::println);

// 3. Map values
map.values().forEach(System.out::println);

自定义操作Map中的元素:

Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("C", 3);

// 1.Map entries
Consumer<Map.Entry<String, Integer>> action = entry -> {
	System.out.println("Key is " + entry.getKey());
	System.out.println("Value is " + entry.getValue());
	System.out.println();
};
map.entrySet().forEach(action);
发布了42 篇原创文章 · 获赞 10 · 访问量 7038

猜你喜欢

转载自blog.csdn.net/MCJPAO/article/details/103946763