A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 云际水流 初级黑马   /  2015-5-11 11:19  /  3322 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

百度的解释是相当于:
int[] arr = new int{1,2,3,4};
for{int i =0; i < arr.length() ; i++ }{
   i = arr;
}问题来了 循环里已经把arr赋值给i了 循环体结束后 i++会怎样 还会是按照0,1,2,3,4的下标吗?我是写了段代码测试了一下
  1. public class test {
  2.         public static void main(String args[]){
  3.                 int[] arr = {1,5,2,4,3,7,1};
  4.                 for(int i:arr){
  5.       System.out.println("arr[i]=" + i);
  6.                 }
  7.         }
  8. }
复制代码
在循环体里输出 i 确实是输出了arr,也就是说在循环体 原本代表下标的i已经被赋值成arr 。可是它也遍历了整个数组 并不因为循环体里i的改变 而改变了循环的下标。那循环体最后又发生了什么,使得下标恢复正常?因为循环体里i已经被赋值了arr,不再是下标值了,那在循环体里如何获取当前的下标?求助!

18 个回复

倒序浏览
额。。。看问题看了半天,楼主哪  我就解释for (int i : arr)这个东东吧 以下纯属个人见解。。。如有错误 请大家指出来。
for(int i:arr)是一个增强for循环。不知道楼主知道迭代器不,应该知道吧 就是那个iterator。这增强for循环的循环体其实就是一个iterator遍历。楼主可能是被那百度说的那个循环的i弄混了。for(in i:arr) 这个i就是表示arr数组里面的某一个值。楼主也提出了如何就能得到arr的下标,这个增强for循环的一个缺点就是没法得到数组下标,以及不能对数组进行一些插入删除操作。那如果非要得到一个下标那,那就自己设一个标记位啦。。。每次循环完自增。下面是一个迭代器的例子,它貌似就是完成for(int i :arr)的,你提出的下表如何就恢复正常了。那是因为这个迭代器处理了。。。(好像是)要不在看看别人的回复。
  1. public void iterArr(){
  2.                 //声明迭代器
  3.                 Iterator<String> iterators;
  4.                 //要求容器返回一个Iterator
  5.                 iterators = arr.iterator();
  6.                 //检查序列中是否还有元素
  7.                 while(iterators.hasNext()){
  8.                         //输出迭代器下一个值(注:第一次调用Iterator的next()方法时,它返回序列的第一个元素)
  9.                         System.out.println(iterators.next());
  10.                 }
  11.         }
复制代码
回复 使用道具 举报 1 0
醉了,谁跟你说那个i是代表计数器?它是arr中的某个元素。
回复 使用道具 举报
学习了,都是些细节问题啊
回复 使用道具 举报
只题是一个加强的for循环,也可以理解成一个迭代器Iterator的表现形式,这里的i表示的不再是一个下标了,例如这题
public class shuzubianjiehe {
        public static void main(String[] args) {
                String[] arr = { "java", "hello", "worde" };
                List<String> list = new ArrayList<String>();
                list = Arrays.asList(arr);
                for (String s : list) {
                        System.out.println(s);
                }
}s表示的是一个字符串。所以再这题中i和下标没有关系
回复 使用道具 举报
for(int i : arr){
System.out.println(i);
}
这个i不在是个下标,而是arr数组通过迭代器迭代出来之后 将每一个值赋值给了i,所以这个只是将arr数组遍历一次。不知道有没有对?
回复 使用道具 举报
你这技术貌似比我还差
回复 使用道具 举报
数组和int不是一个类型。。。不能赋值
回复 使用道具 举报
杨春雨 发表于 2015-5-11 11:48
额。。。看问题看了半天,楼主哪  我就解释for (int i : arr)这个东东吧 以下纯属个人见解。。。如有错误  ...

谢谢你的回复  我有点明白了 是我想当然的以为for里面的i一定是计数器了  
回复 使用道具 举报
fenglinluomu 发表于 2015-5-11 12:12
醉了,谁跟你说那个i是代表计数器?它是arr中的某个元素。

嗯嗯 看了大家的回复 我明白了 是我自己想当然了 谢谢
回复 使用道具 举报
小风1993 发表于 2015-5-11 13:04
只题是一个加强的for循环,也可以理解成一个迭代器Iterator的表现形式,这里的i表示的不再是一个下标了,例 ...

String s,int i 这些代表的是数组里元素的数据类型么?
回复 使用道具 举报
只想好好的 发表于 2015-5-11 13:15
for(int i : arr){
System.out.println(i);
}

嗯嗯 我看了楼上几位的解释 感觉就是这个意思
回复 使用道具 举报
只想好好的 发表于 2015-5-11 13:15
for(int i : arr){
System.out.println(i);
}

嗯嗯 我看了楼上几位的回复 也感觉就是这样的
回复 使用道具 举报
本帖最后由 云际水流 于 2015-5-11 15:20 编辑
小风1993 发表于 2015-5-11 13:04
只题是一个加强的for循环,也可以理解成一个迭代器Iterator的表现形式,这里的i表示的不再是一个下标了,例 ...

也就是说i表示的是遍历的数组里元素的数据类型吗?
二位数组遍历 i 就是一个一维数组 ,不知道这么理解对不对,不过我按照这个逻辑写了一段代码通过了
  1. public class test {
  2.         public static void main(String args[]){
  3.                 int[][] arr = {{1,5,2,4,3,7,1},{3,4,5}};
  4.                 int count = 0;
  5.                 for(int[] i:arr){
  6.                     for(int j:i)
  7.                         System.out.print(j + ",");
  8.                     System.out.println();
  9.                 }
  10.         }
  11. }
复制代码

回复 使用道具 举报
唐泉银 发表于 2015-5-11 13:27
你这技术貌似比我还差

在学校光玩去了 没学好
回复 使用道具 举报
云际水流 发表于 2015-5-11 15:03
谢谢你的回复  我有点明白了 是我想当然的以为for里面的i一定是计数器了   ...

恩恩 就是这个意思 嘿嘿 加油!{:2_36:}
回复 使用道具 举报
云际水流 发表于 2015-5-11 15:08
String s,int i 这些代表的是数组里元素的数据类型么?

嗯嗯,你定义一个什么类型的你就在for循环里定义什么类型
回复 使用道具 举报
云际水流 发表于 2015-5-11 15:03
谢谢你的回复  我有点明白了 是我想当然的以为for里面的i一定是计数器了   ...

for(int i :arr)     i代表的是数组的元素,而元素的类型是int
回复 使用道具 举报
增强for循环是没有角标的  i是数组的元素   需要用到索引的时候就不能用增强
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马