再学Java 之 foreach循环
从Java 5 之后,Java提供了一种新的循环:foreach循环,这种循环遍历数组和集合更加简洁。
foreach循环语法格式如下:
for ( type variableName : array | collection){
//variableName自动迭代访问每个元素
}
在很多书籍中,都能找到这么一句话“使用foreach循环迭代数组元素时,并不能改变数组元素”。如:
String books = {"a","b","c"};
//使用foreach遍历,然后赋予新的值
foreach ( String book : books ){
book = "d";
}
//重新输出,发现输出的依然是:a , b , c ,
foreach ( String book : books ){
System.out.print(book+" , ");
}
然而这句话其实并不对。
我们都知道,foreach循环中,variableName就相当于是一个临时变量,系统依次将数组元素赋给这个临时变量,而对这个元素进行赋值,并不影响原数组;
事实上,这一个临时变量类似于函数方法的参数,假如该变量是基本类型,则对该临时变量进行操作不会影响到原数组;但是,假如该变量是引用变量,则对该变量进行操作,会影响到原数组。
如:
public class Run_main {
public static void main(String[] args){
A[] arr = {new A(),new A(),new A()};
for (A a : arr) {
System.out.println(a.a);
}
for (A a : arr) {
a.a = 2;
}
//输出为 2, 2, 2
for (A a : arr) {
System.out.println(a.a);
}
}
}
class A{
public int a= 12;
}
在上面的程序中,由于数组的元素是引用变量,所以,对类A的实例进a.a = 2 的赋值操作会影响到原数组。
总结:foreach循环中的临时变量可以与方法中的参数进行类比,当该变量为基本类型,则对其操作,不影响原数组;假如为引用变量,就是将数组元素的引用地址赋予该临时变量,那么对该临时变量的操作将会影响原数组。
再学Java 之 foreach循环的更多相关文章
- 再学Java 之 interface的成员变量
前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然 ...
- [置顶] java的foreach循环
foreach语句是java5之后的新特征之一,在循环遍历数组.集合方面更加简洁. 使用foreach循环遍历数组和集合时,无需获得数组和集合的长度,无须根据索引来访问数组元素和集合元素,foreac ...
- PHP和Java中foreach循环的用法区别
1.foreach语句介绍: ①PHP: foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息. ...
- Effective Java 之-----for-each循环优于传统的for循环
如下代码: enum Face {1,2,3,4,5,6}: ...... Collection<Face> faces = Array.asList(Face.values); for( ...
- 再学Java 之 Integer 包装类缓存
前言:本博文将涉及的Java的自动装箱和自动拆箱,可以参考 这篇文章 和 官方教程 ,这里不再赘述. 首先,先看一个小程序: public class Main { public static voi ...
- JAVA 中for-each循环使用方法
for each循环还是第一次见,“java SE 5.0增加了一种功能很强的循环结构,可以用来一次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心”. 这种增强的for eac ...
- 再学Java 之 HashMap的底层实现
今天参加欢聚时代的面试,我说我自己依靠自己的理解重新实现过HashMap.描述我自己的实现思想后,面试官问“hashmap”底层如果用数组不是效率比较低吗,不是更应该用红黑树吗?我一下子就蒙了.用数组 ...
- 再学Java 之 形参个数可变函数
自Java 5后,Java允许定义形参个数可变的方法,从而允许运行过程中,为方法指定不确定个数的形参. 其定义方法的格式如下: void function_name ( type ... variab ...
- 再学Java 之 解决No enclosing instance of type * is accessible
深夜,临睡前写了个小程序,出了点小问题 public class Test_drive { public static void main(String[] args){ A a = new A(); ...
随机推荐
- (KMP 求循环节)The Minimum Length
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70325#problem/F The Minimum Length Time Limit: ...
- 梯度下降VS随机梯度下降
样本个数m,x为n维向量.h_theta(x) = theta^t * x梯度下降需要把m个样本全部带入计算,迭代一次计算量为m*n^2 随机梯度下降每次只使用一个样本,迭代一次计算量为n^2,当m很 ...
- Send or receive files via Xshell
1. install lrzsz $ sudo apt-get install lrzsz 2. If you want to send file from your pc to pi, just d ...
- Replication--复制事务和复制命令
--=============================================== 对复制一直属于一知半解浑浑噩噩的状态,仅知道一些皮毛,对很多细节没有深入学习过, 如果不对之处,请各 ...
- SqlDataReader 结果集 转成 DataTable
/// <summary> /// SqlDataReader 转成 DataTable /// 源需要是结果集 /// </summary> /// <param na ...
- C#HttpUtility.UrlEncode 大写问题
工作上和另一个公司对接,调对方的api需要用到md5加密,加密前要使用HttpUtility.UrlEncode,对方接口一直返回验证错误,定位了问题发现是中文编码使用HttpUtility.UrlE ...
- 自定义Asp.net core——日志记录
本文我将演示如何定制日志记录.默认的日志记录仅仅向控制台或者debug窗口输出日志,这样可以满足一些情况,但是你可能还需要把日志记录到一个磁盘文件或者数据库,或者你想为记录额外的信息.这样的场景你就需 ...
- NetCore入门篇:(二)Net Core项目创建
一.新建项目 1.选择菜单:文件 -> 新建 -> 项目 2.选择模板:NET Core -> ASP.NET Core Web 应用程序,输入名称 3.选择框架:ASP.NET C ...
- 【cocos2d-x 仙凡奇缘-网游研发(2) 角色换线系统】
转载请注明出处:http://www.cnblogs.com/zisou/p/xianfan01.html 做一款游戏就先得制作好策划文档,和基本的人物世界构架的设计,然后架空在这样一个虚拟的世界中每 ...
- Weekly Contest 130
1029. Binary Prefix Divisible By 5 Given an array A of 0s and 1s, consider N_i: the i-th subarray fr ...