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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵天强 中级黑马   /  2012-11-16 18:37  /  1873 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邵天强 于 2012-11-16 21:35 编辑

请看下面代码:
public void test2(){
  List<String>list=new ArrayList<String>();//创建一个list集合
  list.add("黑马_1");//向集合中添加元素
  list.add("黑马_2");//向集合中添加元素
  list.add("黑马_3");//向集合中添加元素
  list.add("黑马_4");//向集合中添加元素
  for(String str:list){//利用增强for循环打印集合中的元素
   str="黑马程序员";
  }
  System.out.println(list.get(3));
}
上面运行的结果是:黑马_4,
我有个疑问:为什么不是黑马程序员呢?难道增强for循环不能改变集合中的元素吗?还是其他的原因

点评

因为你打印的是list集合的第三个元素吧  发表于 2012-11-16 19:48

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 廖力 于 2012-11-16 20:39 编辑

增强新for循环的使用
1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的,
但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。
2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。
3.而对于LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强for循环,也就是iterator。
  1. public class MainClass {

  2.         public static void main(String[] args) {
  3.                 ArrayList<String> al = new ArrayList<String>();
  4.                 al.add("黑马_1");
  5.                 al.add("黑马_2");
  6.                 al.add("黑马_3");
  7.                 al.add("黑马_4");
  8.                 for (String str : al) {
  9.                         System.out.print("增强for循环:");
  10.                         str = "黑马程序员";
  11.                         System.out.println(str);
  12.                 }
  13.                 for (int i = 0; i < al.size(); i++) {
  14.                         System.out.print("普通for循环:");
  15.                         System.out.println(al.get(i));
  16.                 }
  17.                
  18.                
  19.                 ArrayList<MyString> al2 = new ArrayList<MyString>();
  20.                 al2.add(new MyString("黑马_1"));
  21.                 al2.add(new MyString("黑马_2"));
  22.                 al2.add(new MyString("黑马_3"));
  23.                 al2.add(new MyString("黑马_4"));
  24.                 for (MyString ms : al2) {
  25.                         System.out.print("增强for循环:");
  26.                         ms.str = "黑马程序员";
  27.                         System.out.println(ms);
  28.                 }
  29.                 for (int i = 0; i < al.size(); i++) {
  30.                         System.out.print("普通for循环:");
  31.                         System.out.println(al2.get(i));
  32.                 }
  33.         }
  34. }

  35. class MyString {
  36.         public String str = null;

  37.         public MyString(String str) {
  38.                 this.str = str;
  39.         }

  40.         public String toString() {
  41.                 return str;
  42.         }
  43.         
  44. }
复制代码
上面代码有个一个很奇怪的现象:
当把String类封装一下变成MyString类就能修改了

版主和2楼都理解错意思了吧
楼主不是问为什么输出的是 黑马_3 而不输出 黑马_4
楼主问的是为什么输出的是 黑马_4 而不输出 黑马程序员

刚刚又实验了一下用int和Integer以及自己封装一个int的MyInteger类 依然是一样的情况
我的理解是这样的 楼主应该知道c的指针吧
foreach中当集合中的元素是基础类型时传回来的就是直接的值
而当集合中的元素不是基础类型时 传回来的是对象就相当于c中的指针
不知道我理解的对不对... ...

Integer虽然是int的封装类
但是他的定义中有这样一句
public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
而API中的Class类中没有getPrimitiveClass方法 然后查源码:
static native Class getPrimitiveClass(String name);
说明其实Integer的类型还是int类型 只不过强转了Integer
不知道我理解的对不对... ...

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
没有得到的原因是:下标是从零开始的 ,你要是要得到“黑马_3” ,get()方法里面的值应该是2
回复 使用道具 举报
public class Test1{
public static void main(String args[])
{
      List<String> list = new ArrayList<String>();
      list.add("黑马_1");
      list.add("黑马_2");
      list.add("黑马_3");
      for(String str:list)
     {
          System.out.print(str + " ");//打印list的内容
          str = "黑马程序员";//重新赋值
         System.out.print(str + " ");//打印新的值
    }
}
}
输出内容如下:
黑马_1 黑马程序员 黑马_2 黑马程序员 黑马_3 黑马程序员 [黑马_1, 黑马_2, 黑马_3]
分析一下输出过程,第一次,str被赋值list.get(0),即str = list.get(0);所以第一个打印语句输出:黑马_1;str = "黑马程序员";str被重新重新赋值,所以第二个打印语句输出:黑马程序员。楼主肯定是纠结既然str和list.get(0)指向同一个堆地址,既然通过给str赋值改变了内容,为什么list.get(0)的内容为什么没有变,如下图

str刚开始是指向list.get(0);但是被赋值str = "黑马程序员";之前的指向断开了,指向另外的地址了,所以根本不会改变list的内容

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
增强for循环调用的是ieterator的方法。代码执行for(String str:list)打印的是:黑马_1,但是代码执行到str="黑马"是就会把str的指向改变,但是list集合里的元素没有改变,所以System.out.println(list.get(3));打印的还是:黑马_4.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马