再学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循环,码迷,mamicode.com

时间: 2024-07-30 20:25:29

再学Java 之 foreach循环的相关文章

java之j2se:再学java对象容器

今天是开学第一天,按照上学期的讲课进度,本该是可以开始学习多线程了,但是由于换了老师,可能交接方面有点出入,又给我们讲授了一遍java对象容器,所以这也是为什么题目为"再学". 本文目录: 集合的主要用途 单值类集合:List类与Set类 键值对类集合:Map类 集合的主要用途:集合主要在查询数据返回的时候常用.比如要使用jsp做一个学生信息管理系统,需要从数据库中返回查询学生的结果,把这些结果放入一个集合里,再通过方法返回,在显示层(view)可以使用jsp标签来把他们显示出来. 单

再学Java 之 private、protected、public和default的作用域

前言:如果提到protected的访问控制级别,您的第一反应是"只能是子类才可以访问",那么您很可能需要往下看. 首先,大致介绍一下各个访问控制符的访问控制级别(具体的介绍很多大牛的博文都有介绍,我就不细说了,可以点击这里查看),如下图:   private default protected public 同一个类中 √ √ √ √ 同一个包中   √ √ √ 子类中     √ √ 全局范围内       √ 在这里,很多人都存在一个误区,就是,认为protected修饰的方法只能

再学Java 之 Integer 包装类缓存

前言:本博文将涉及的Java的自动装箱和自动拆箱,可以参考 这篇文章 和 官方教程 ,这里不再赘述. 首先,先看一个小程序: public class Main { public static void main(String[] args){ Integer i1 = new Integer(1); Integer i2 = new Integer(1); System.out.println(i1 == i2); Integer i3 = 1; Integer i4 = 1; System.

再学Java 之 形参个数可变函数

自Java 5后,Java允许定义形参个数可变的方法,从而允许运行过程中,为方法指定不确定个数的形参. 其定义方法的格式如下: void function_name ( type ... variables){ //对variables数组进行操作 } 在上面格式中,系统将输入的参数全部存储到variables数组中.也就是说,下面的定义方式,其实是相同的: void function_name ( type ... variables); void function_name ( type[]

再学Java 之 interface的成员变量

前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然后让其他类通过类名访问他.在这里,想使用之前实训项目的第一版应用层协议的设计想法,即使用一个接口类来定义所有子类都会使用到的变量.然后,就引出了一个interface成员变量和static final的问题. (一)一个简单的问题 首先,看一段代码: 1 //Variable.java 2 publ

从字节码看Java中for-each循环(增强for循环)实现原理

转发:http://blog.csdn.net/u011392897/article/details/54562596 for-each循环是jdk1.5引入的新的语法功能.并不是所有东西都可以使用这个循环的.可以看下Iterable接口的注释,它说明了除了数组外,其他类想要使用for-each循环必须实现这个接口.这一点表明除了数组外的for-each可能底层是由迭代器实现的. Iterable接口在1.8之前只有一个方法,Iterator<T> iterator(),此方法返回一个迭代器.

PHP和Java中foreach循环的用法区别

1.foreach语句介绍: ①PHP: foreach 语法结构提供了遍历数组的简单方式.foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息. ②Java: foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便.foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本.foreach并不是一个

java基础 Foreach循环

java SE5 引入了一种新的更简洁的for语句用于数组和容器,即foreach语法,表示不必要创建int变量去对有访问构成的序列进行计数,foreach将自动的产生每一项. 任何一个数组的方法都可以使用foreach,例如: public class ForEachString{ public static void main(String[] args){ foreach( char c : "Hello world".toCharArray( ) ) ; System.out.

JAVA 中for-each循环使用方法

for each循环还是第一次见,“java SE 5.0增加了一种功能很强的循环结构,可以用来一次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心”. 这种增强的for each循环的语句格式为: for(variable : collection)statement 定义一个变量用于暂存集合的每一个元素,并执行相应的语句.collection这一集合表达式必须是一个数组或者是一个实现了list等接口的类(重要).