【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变量只是一个局部变量,而且还是集合中元素的一个副本,并不是元素本身。
相关文章:

参加软件测试培训需要学什么技术
软件测试这项技术在几年可谓是风头正盛,很多人都想要跳槽到这个行业,那么就需要学会软件测试技术,那么目前参加软件测试培训需要学什么技术呢?来看看下面的详细介绍吧。 参加软件测试培训需要学什么技术? 每个软件在上线之前都离不开重重测…

程序集和应用程序域
这两个概念是DotNet程序员经常见到的,但好多人搞不清它们。虽然MSDN对它们有相关的说明,但并不是那么容易看懂。在这里灰灰虫根据自己的理解用简单易懂的语言解绍一下它们。程序集(assembly) “程序集是包含编译好的、面向.NET Framework的代码的逻辑…

股市币市:数据分析与交易所最新公告
投资原则: 极端牛市是攒钱的时候(分位数达到100),极端熊市是攒票的时候(分位数低于40%),股指已经屡创新高,你再不攒钱就不对了,同理,股指屡创新低,…

OpenGL学习(hello)
#include <gl/glut.h>void display(void){glClear(GL_COLOR_BUFFER_BIT); // 清除颜色缓冲以及深度缓冲glColor3f(1.0, 1.0, 1.0);glBegin(GL_POLYGON); // 绘画開始话多边形/*glVertex3f(0.25, 0.25, 0.0);glVertex3f(0.75, 0.25, 0.0);glVertex3f(0.75, 0.75, 0.0);glV…

选择python培训机构的关键考核五大因素,让你永不吃亏!
近几年,对于Python技术在人工智能领域的广泛使用,想要学习Python技术的人越来越多,市面上的Python培训机构也多了起来,如何选择适合的Python培训机构成了困扰大家的问题,下面小编就我大家详细的解析一下选择python培训…

Maven 的classifier的作用
直接看一个例子,maven中要引入json包,于是使用了 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.2.2</version> </dependency> 可是,当…

NPOI 导出Excel
找到dll文件引用 using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System; using System.IO;namespace NPOI.WriteExcel {class Program{/*NPOI.DLL:NPOI 核心函式庫。NPOI.DDF.DLL:NPOI 繪圖區讀寫函式庫。NPOI.HPSF.DLL:NPOI 文…

如何利用 C# 实现 K 最邻近算法?
众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问题。没有哪个电影人会说自己制作的电影和…

参加java培训真的能学到有用的吗
java技术在互联网行业的快速发展,优渥的待遇,让很多人都想学习这项技术,目前市面上开设java培训的机构越来越多,很多人都担心参加java培训能学到知识吗?下面我们来看看具体的解析。 参加java培训能学到知识吗?在Java培训机构能不…

android自定义调节器控件 —— RegulatorView
2019独角兽企业重金招聘Python工程师标准>>> RegulatorView效果图: RegulatorView实现步骤: 1.新建java类RegulatorView.java,继承View类 2.定义必要基础属性,及为其附初始值 private final static int BTN_RADIUS20;/…

如何利用 C# 实现 K-D Tree 结构?
我的朋友海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但她没有从中找到喜欢的人。经过一番总结,她发现曾交往过三种类型的人: 不喜欢的人魅力一般的人极具魅力的人 尽管发现了上述规律,但海…

[恩难到了]陨石的秘密
【描述】 公元19881231年,一颗巨大的陨石坠落在世界的政治文化中心cs。于是,灾难降临了,地球上出现了一系列反常的现象。当人们焦急万分的时候,一支由cs科学家组成的考察队赶到了出事地点。经过一番侦察,科学家们发现陨…

java培训学习阶段步骤讲解
目前的培训机构行业比较热门的IT技术就是java技术,java技术在近几年广受关注,java所涉及的技术知识也比较广泛,下面小编就为大家详细的介绍一下java培训学习多有哪几个阶段? java培训学习多有哪几个阶段: 第一阶段、Java设计和编…

资料分享:送你一本《机器学习实战》电子书!
这两天,各985高校发布了考研初试分数线。从中发现这两年大数据相关专业的分数线暴涨啊。没有400分估计心里都没底啊。可见大数据这个领域有多火爆!而机器学习是我们团队的一个主要方向,新加入的同学通常都是从《机器学习实战》这本书开始入门…

HDU 6091 - Rikka with Match | 2017 Multi-University Training Contest 5
思路来自 某FXXL 不过复杂度咋算的.. /* HDU 6091 - Rikka with Match [ 树形DP ] | 2017 Multi-University Training Contest 5 题意:给出N个点的树,求去边的方案数使得 去边后最大匹配数是M的倍数限制: N<5e4, M<200 分析ÿ…

在别的电脑上运行cg程序出现错误的解决办法
错误:没有找到cg.dll,因为这个应用程序未能启动。重新安装应用程序可能会修复此问题 解决方法:复制cg.dll到system32 、debug中 错误:没有找到cgGL.dll,因为这个应用程序未能启动。重新安装应用程序可能会修复此问题 解…

HTML在网页设计中是什么作用?
HTML是一种超文本传输协议,规定了浏览器与服务端之间数据传输的格式,是一种标识性的代码语言,它的中文翻译是“超文本标记语言”,主要是通过HTML标签对网页中的文本、图片、声音等内容进行描述。HTML提供了许多标签,如…

如何实现链接只能被点击一次
有时候,只希望网站某个链接只能被点击一次,怎么做呢?下面给出3中方法!第一种:利用JS在点击后把href变成#把taget变成空。 <p><a onclick"var that this;setTimeout(function(){that.removeAttribute(hr…

匿名类型和Object转换
.net中的匿名类型非常好用, 但是开发中遇到一个问题,当把匿名类型作为返回值的时候,会变成object类型,如果才能再转换能对应的匿名类型呢? 1 //返回匿名类型的函数, 会转换成object类型2 object ReturnAnonymous() {3 retur…

资料分享:送你一本《数据结构(C#语言版)》电子书!
对于信息类专业的学生而言,数据结构与算法是一门必修的课程。只有学好这门课程,熟练掌握线性表、栈、队列、树、图等基本结构,以及在这些结构上的各种算法,才能利用计算机去解决实际问题。 如何学好这门课程呢,给大家…

新手入门API测试必要了解的知识
什么是API?API是Application Programming Interface的简写。实现了两个或多个独立系统或模块间的通信和数据交换能力。 什么是API测试?API测试是不同于UI级自动化测试,其主要关注在系统架构的业务逻辑层,所以其主要关注不在于UI操作或用户感观上&#…

java监控多个线程的实现
场景:需要启动多线程处理事情,而在所有事情做完之后,需要修改系统状态;那么如何判断所有线程(事情)都做完了呢?这就需要判断所有当前运行的线程状态了。 代码 importjava.util.concurrent.Count…

如何利用 C# 实现神经网络的感知器模型?
前几天我们介绍了 如何利用 C# 对神经网络模型进行抽象,在这篇图文中,我们抽象了单个神经元 Neuro,网络层 Layer,网络结构 Network,激活函数 IActivationFunction,以及监督学习 ISupervisedLearning 和非监…

JPA增删改查,
2019独角兽企业重金招聘Python工程师标准>>> 1. //And --- 等价于 SQL 中的 and 关键字 public List<User> findByHeightAndSex(int height,char sex); 2. // Or --- 等价于 SQL 中的 or 关键字 public List<User> findByHeightOrSex(int height,cha…

Java新手会遇到的三大误区,一定要避免!
很多学习java技术的学员都是零基础学员,之前对java技术一点都不了解,所以java新手在学习java技术的时候很容易进入误区,下面小编分享的Java新手会遇到的三大误区,一定要避免! 作为目前最为广泛的网络编程语,Java凭借其…

[ACM] hdu 1253 胜利大逃亡 (三维BFS)
胜利大逃亡 Problem DescriptionIgnatius被魔王抓走了,有一天魔王出差去了,这但是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,能够被表示成A个B*C的矩阵,刚開始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,如今知道魔王将在T分钟后…

如何利用 C# 爬取带 Token 验证的网站数据?
在对文本数据的情感分析中,基于情感词典的方法是最简单也是最常用的一种了。 它的大体思路如下: 对文档分词,找出文档中的情感词、否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前的否定…

多线程显示运行状态
最近碰见一个例子,Copy大文件或者网络访问的时候处理假死。 那就用多线程加个进度条(只显示运行,没有进度)来表示状态运行吧。好了,废话少说,上个例子。先看结果图: 程序说明: 点击Button,运行…

【Python培训基础知识】单例模式
单例模式是保证一个类仅有一个实例的设计模式。Windows中的任务管理器就是一个典型的单例模式软件。Windows任务管理器如图所示。 Windows任务管理器只能打开一个,即使用户重复打开,也只能获得一个实例,这不同于Word等软件可以打开多个实例。…

Android读写XML(上)
XML 经常用作 Internet 上的一种数据格式,其文件格式想必大家都比较清楚,在这里我结合Android平台,来说明Android SDK提供的读写XML的package。 首先介绍下Android SDK与Java SDK在读写XML文件方面,数据包之间的关系。Android 平台…