Java的循环结构及嵌套循环
Java的循环结构
Java 总共有三种循环结构,分别是while、do…while、for。
while 循环结构
while 循环语法:
while(布尔表达式) {
//功能语句
}
代码执行顺序:
- 判断小括号中的值是否为 true,如果为 true,执行功能语句。
- 执行完功能语句,继续判断小括号中的值,如果为 true,继续执行功能语句。
- 直到判断小括号中的值为 false,跳出循环。
do…while 循环结构
do…while 语法结构:
do {
//功能语句
} while(布尔表达式);
代码执行顺序:
- 首先执行 do 结构体里面的功能代码一次。
- 第一次判断 while() 结果为 ture。
- 执行 do 循环体。
- 第二次判断 while() 结果为 ture。
- 执行 do 循环体。
- …
- 第 n 次判断 while() 结果为 false 循环结束。
和while的区别:
- 语法结构上的区别。
- while 语句是先判断条件是否成立再执行语句,条件不符合后终止。do…while 是先执行语句再判断条件是否成立,条件不符合后终止。
- do…while 循环至少执行一次功能语句。
for 循环结构
for 语法结构:
for (循环初始化语句A; 循环判断语句B; 循环后语句D) {
//功能语句C
}
执行顺序:
- 循环初始化语句A执行一次。
- B --> true ----> C ----> D。
- B --> true ----> C ----> D。
- …
- B --> false,循环结束。
特点:
for ( ; ; ) {不加功能语句}
,死循环。for ( ; ; )
后直接跟功能语句(1句)死循环。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
特点:
- 循环结构结束不等于方法结束,for 循环结构体后面的语句还会正常运行
- break 只是终止当层循环:
- 如果在内层想要终止外层循环:可以给外层循环取一个别名,然后使用
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);