【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题
foreach语句使用总结
增强for(part1:part2){part3};
part2中是一个数组对象,或者是带有泛性的集合.
part1定义了一个局部变量,这个局部变量的类型与part2中的对象元素的类型是一致的.
part3当然还是循环体.
import java.util.List;
import java.util.ArrayList;
public class TestArray {
public static void main(String args[]) {
TestArray test = new TestArray();
test.test1();
test.listToArray();
test.testArray3();
}
/**
* foreach语句输出一维数组
*/
public void test1() {
//定义并初始化一个数组
int arr[] = {2, 3, 1};
System.out.println("----1----排序前的一维数组");
for (int x : arr) {
System.out.println(x); //逐个输出数组元素的值
}
//对数组排序
Arrays.sort(arr);
//利用java新特性for each循环输出数组
System.out.println("----1----排序后的一维数组");
for (int x : arr) {
System.out.println(x); //逐个输出数组元素的值
}
}
/**
* 集合转换为一维数组
*/
public void listToArray() {
//创建List并添加元素
List<String> list = new ArrayList<String>();
list.add("1");
list.add("3");
list.add("4");
//利用froeach语句输出集合元素
System.out.println("----2----froeach语句输出集合元素");
for (String x : list) {
System.out.println(x);
}
//将ArrayList转换为数组
Object s[] = list.toArray();
//利用froeach语句输出集合元素
System.out.println("----2----froeach语句输出集合转换而来的数组元素");
for (Object x : s) {
System.out.println(x.toString()); //逐个输出数组元素的值
}
}
/**
* foreach输出二维数组测试
*/
public void testArray2() {
int arr2[][] = {{4, 3}, {1, 2}};
System.out.println("----3----foreach输出二维数组测试");
for (int x[] : arr2) {
for (int e : x) {
System.out.println(e); //逐个输出数组元素的值
}
}
}
/**
* foreach输出三维数组
*/
public void testArray3() {
int arr[][][] = {
{{1, 2}, {3, 4}},
{{5, 6}, {7, 8}}
};
System.out.println("----4----foreach输出三维数组测试");
for (int[][] a2 : arr) {
for (int[] a1 : a2) {
for (int x : a1) {
System.out.println(x);
}
}
}
}
}
2
3
1
----1----排序后的一维数组
1
2
3
----2----froeach语句输出集合元素
1
3
4
----2----froeach语句输出集合转换而来的数组元素
1
3
4
----4----foreach输出三维数组测试
1
2
3
4
5
6
7
8
Process finished with exit code 0
public static void main(String args[]) {
//定义一个一维数组
int arr[] = new int[4];
System.out.println("----未赋值前输出刚刚定义的数组----");
for (int x : arr) {
System.out.println(x);
}
//通过索引给数组元素赋值
System.out.println("----通过循环变量给数组元素赋值----");
for (int i = 3; i > 0; i--) {
arr[i] = i;
}
//循环输出创建的数组
System.out.println("----赋值后,foreach输出创建好的数组----");
for (int x : arr) {
System.out.println(x);
}
}
}
运行结果:
0
0
0
0
----通过循环变量给数组元素赋值----
----赋值后,foreach输出创建好的数组----
0
1
2
3
Process finished with exit code 0
foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。相对老的for语句来说是个很好的补充。提倡能用foreach的地方就不要再用for了。在用到对集合或者数组索引的情况下,foreach显得力不从心,这个时候是用for语句的时候了。foreach一般结合泛型使用
四、foreach写失效的问题
Java中的细节一定要清楚,否则非常容易出现问题。例如这个场景:遍历一个集合,对符合某种条件的元素做修改。大家往往会写出如下代码:
1 public class JavaTest 2 { 3 public static void main(String[] args) 4 { 5 ArrayList<Integer> list = new ArrayList<Integer>(); 6 list.add(1); 7 list.add(2); 8 list.add(3); 9 for (Integer temp : list) 10 { 11 if (temp == 1) 12 { 13 temp = temp * 2; 14 } 15 } 16 for (Integer a : list) 17 { 18 System.out.println(a); 19 } 20 } 21 }
期待的结果是:
2
2
3
但实际输出为:
1
2
3
这是很容易掉进去的陷阱。即通过foreach遍历对集合元素进行修改。在以为变更已发生的时候,其实变更没有发生。造成数据写入失败。因为
for (Integer temp : list) {if (temp == 1){temp = temp * 2;} }
根据oracle的官方文档,正式翻译应该如下
for (Iterator i = list.iterator(); i.hasNext(); ) {float i0 = (Integer)i.next();if(i0 == 1)i0 = i0*2; }
即:foreach里头的的 temp变量只是一个局部变量,而且还是集合中元素的一个副本,并不是元素本身。
【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题相关推荐
- Java学习笔记二十:Java中的内部类
Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...
- Java学习笔记(十)--控制台输入输出
输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...
- `java`学习笔记(十二)`Java`--`String``StringBuffer``StringBuilder`
Java–String&&StringBuffer&&StringBuilder 文章目录 `Java`--`String`&&`StringBuffe ...
- 【Java学习笔记四】Java中的包
包的声明和引入:在Java语言系统中,Java编译器为每一个类生成一个字节码文件(.class),为了对类文件进行分层和按用途分类管理,同时也为了解决相同类名的文件冲突的问题,Java提供了包机制来管 ...
- JAVA学习笔记(三十九)-打印流
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; i ...
- 【Java学习笔记之一】java关键字及作用
Java关键字及其作用 一. 总览: 1 访问控制 2 private protected public 3 4 类,方法和变量修饰符 5 abstract class extends final i ...
- 【Java学习笔记1】Java概述 -背景+环境搭建
文章目录 Java语言概述 Java介绍 1. 软件开发概述 2. 计算机语言 3. Java 简史 4. Java 技术体系平台 6. Java语言特点 7. Java核心机制一-Java虚拟机 8 ...
- 【Java学习笔记】38.Java 发送邮件
Java 发送邮件 使用Java应用程序发送 E-mail 十分简单,但是首先你应该在你的机器上安装 JavaMail API 和Java Activation Framework (JAF) . 您 ...
- 【Java学习笔记之七】java函数的语法规则总结
函数的概述 发现不断进行加法运算,为了提高代码的复用性,就把该功能独立封装成一段独立的小程序,当下次需要执行加法运算的时候,就可以直接调用这个段小程序即可,那么这种封装形形式的具体表现形式则称作函数. ...
最新文章
- AI不止能美颜,美妆迁移这样做 | 赠书
- AI闯入法律界,第一步是当律师的得力助手
- 梯度下降原理及Python实现
- 华为鸿蒙ai字幕,EMUI11一个值得吹爆的功能?AI字幕,支持翻译英日韩
- mysql 传统数据恢复_MySQL误操作后如何快速恢复数据
传统解法
利用binlog2sql快速闪回
常见问题
参考资料...
- nginx html 不缓存,nginx如何实现js和css不缓存
- 1.7 LINUX启动流程
- 启动go服务_使用Go构建TCP并发服务器,这种方式原来这么简单
- ApacheCN 数据科学译文集 20211109 更新
- 魏俊妮《非人力资源的人力资源管理技术提升》课程大纲
- java随机答题器_Advanced Random Auto Clicker免费版下载-多合一随机自动答题器 v4.21 免费版 - 安下载...
- 【MV】恋爱サーキュレーション 马琴舞蹈完整版
- Skleran-线性模型-普通最小二乘法-LinearRegression
- 掐头去尾-利用正则表达式的匹配顺序
- 电脑安装虚拟机网络适配器上面没有虚拟机的网络
- 医疗器械标准目录 第二部分专业技术领域(2)
- 国产手机启用鸿蒙系统,国产机会抛弃安卓系统?华为启用全新自研“鸿蒙”系统,你会买吗...
- 2021年最新以太坊源码导读-p2p架构
- 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛
- openGL中的坐标系
热门文章
- 1476. Lunar Code
- 关于jsp页面中的pageEncoding和contentType以及html中的meta标签中字符集的设置(转)...
- C# 自定义事件和委托
- sdut 2401 最大矩形面积
- .Net2.0 使用ConfigurationManager读写配置文件
- ImageNet图像数据集介绍
- 【GLib】GLib学习笔记(二):源码编译
- Linux中bashrc河bash_profile
- html 图片剪裁控件,h5图像裁剪(基于canvas)插件Image-Clip
- python扫雷 广度优先_Leetcode之广度优先搜索(BFS)专题-529. 扫雷游戏(Minesweeper)...