Foreach循环与for循环
foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。
foreach语句是for语句的特殊简化版本,又叫“增强for”,但是foreach语句并不能完全取代for语句。
Foreach循环在数组的应用
一.在一维数组的应用
普遍适用于一维数组的遍历
• 普通变量容器不能通过for-each循环来改变内容
• 普通对象容器可以通过for-each循环来改变内容
1.普通一维数组
可以遍历,无法修改内容
int [] data = {23,45,67,89,100,1111};
for(int k : data) //k为每一轮拿出data中的一个元素
{
System.out.print(k+" ");
}
注意1:foreach只能访问集合中的元素,不能对其中的元素进行修改!
因为从数组中拿出来的元素只是值的对应关系,而不是位置的对应关系!
int [] data = {999,999,999,999,999,999};
//data[] = {1,2,3,4,5};//错,无法赋值,初始化只能在定义的时候做
for(int i = 0;i < data.length;i++)
{
data[i]=1;//普通for循环可以修改数组的值
}
for(int k : data) //每一轮拿出data中的一个元素
{
k=111;//无法修改!
}
for(int k : data)
{
System.out.print(k+" ");
//还是{1,1,1,1,1},说明foreach循环没有改变数组的值
}
2.特殊类
2.1字符串数组(也是对象数组的一种)
可以遍历,无法修改内容
//2.1.字符串数组
String[] sss = new String[10];
for(int i=0;i<sss.length;i++) {
sss[i] = new String("abc");
}
for( String s : sss) {
s = "fshhr";//修改失败! 只是将 s 管理的字符串变成了"fshr"..
}
for( String s : sss) {
System.out.println(s);
}
2.2字符串容器类 ArrayList
可以遍历,无法修改内容
//2.2字符串容器
ArrayList<String> aaa = new ArrayList<String>();
aaa.add("first");
aaa.add("second");
for(String s:aaa) {
System.out.println(s);
}
// for(int i = 0;i < aaa.size();i++) {
// System.out.println(aaa.get(i).replace('f','d'));
// }//普通for遍历
for(String s:aaa){
s=s.replace('f','d');//修改失败
}
for(String s:aaa) {
System.out.println(s);
}
2.3散列表HashMap
可以遍历,无法修改内容
public class HashMap_{
private HashMap<Integer,String> coinnames = new HashMap<Integer, String>();
public HashMap_(){//构造器(构造方法)
//键一定是唯一的,后面的会覆盖前面的键
coinnames.put(1, "penny");
coinnames.put(10, "dime");
coinnames.put(25, "quarter");
coinnames.put(50, "half-dollar");
System.out.println(coinnames);//可以直接输出
//for-each循环遍历HashMap的方法
for(Integer k : coinnames.keySet()) {//从哈希表的键集合里取出每个键
String s = coinnames.get(k); //获取键的值
System.out.println(s);
}
}
public static void main(String] args){
HashMap_ hm = new HashMap_();//每一个键值对都是对象,都是这个类的管理者
System.out.println(hm.getName(amount));
}
}
3.对象数组
可以遍历,可以用容器的方法修改容器内容
//3.对象数组
Int_[] in = new Int_[10]; //对象数组
for(int i = 0;i < in.length;i++) {
in[i] = new Int_();
}
for(Int_ k :in) {
k.repalceA(45);//foreach中可以用对象容器的方法修改容器内容
//k是a的元素(许多个管理者)的复制品,那么就相当于把a的管理权限复制给了k,k就可以管理a所管理的内容
}
for( Int_ k : in) {
System.out.println(k.getA());
}
注意2:for_each循环不可以改变变量的值,但是可以用它去改变对象的值。
二.在二维数组中的应用
同样适合于二维数组的遍历
//二维的for_each循环
for(int[] i : arr)//二维数组取出每一行,注意行是个一维数组!
{
for(int j : i)//一行中的取出每一列
{
System.out.print(j+" ");
}
}