ArrayList list = new ArrayList();
String str1 = "aa";
list.add(str1);
System.out.println(list.get(0));
/** 输出 :aa */
str1 = "bb";
System.out.println(list.get(0));
/** 输出 :aa */
既然ArrayList存放的是引用, 为什么上面的输出始终是aa, 第二次不是bb呢?

解决方案 »

  1.   

    String str1 = "aa";//str1存的是"aa"的地址 打个比方是0x001;
    list.add(0x001);
    str1 = "bb";//更改了str1的值变成了0x002;
    System.out.println(list.get(0));实际上还是0x001
      

  2.   

    这个你可以了解一下JAVA的值传递.实际"aa"是一个对象,在相当于new String("aa"),str1是一个引用,指向"aa"所在的地址.调用list.add(str1)的时候,传递给list对象的是"aa"对象所对应的地址当执行str1="bb"的时候是把str1引用指向了另一个地址,实际上这时候堆中有两个字符串对象,"aa"和"bb"
    lsit.get(0)指向"aa",str1指向"bb".可能描述的比较麻烦,不知道你能不能看明白,如果不明白建议看一下值传递及Java的内存机制.
      

  3.   

    String 不是引用类型。
    你的代码情况执行后,数组的结果如下:
    ArrayList list = new ArrayList();
    list[0] = "aa";所以不管你怎么去list.get(0)都是返回aa
      

  4.   

    String是个特殊情况,正常情况你只要把它当成值类型使用就可以了。包括你现在的情况
      

  5.   

    一楼、二楼说的都对。一楼比较清晰点。二楼有点繁。你的List中保存的是String类型的地址,其实不是地址
    所以不管str1怎么变,你的List中的值还是之前的那个地址......
      

  6.   


    多谢, 也就是说 ‘引用’就 = ‘地址’,因为引用里面存放的就是地址的值, list里面存放的既是引用, 又是地址。 可以这么理解吧?
      

  7.   

    你所增加到list的值是aa,即使改变了str1的值,但是你并没有改变list的值,况且对于list.get(0)来说只有aa一个值
      

  8.   

    因为String是不可变类,
    如果想看效果的话,可以定义一个类,如果通过修改对象的属性要看效果。
      

  9.   

    核心部分就是JAVA值传递,这个很简单的.上网找一下相关的说明介绍就可以了.
      

  10.   

    对对,1 、2 楼都说的蛮好的,LZ可以想象一下“图”的内存空间,str1 只是一个引用,传递给list 的时候把str1自己的 地址”值“传递给list,然后他指向另一个对象“bb”,打算你list里面 的值和他是没再有关系了。 
      

  11.   

    这样实现代码,就可以输出两个都是aa,
    import java.util.ArrayList;
    import java.util.List;
    public class ArrayListTest
    {
    public static void main(String [] args)
    {
    List <String> list = new ArrayList<String>();
    String str1 = "aa";
    list.add(str1);
    System.out.println(list.get(0));
    /** 输出 :aa */
    str1 = "bb";
    System.out.println(list.get(0));
    }
    }
      

  12.   

    句柄-->对象内存地址 str1是句柄,list.add(str1);首先list也是由数组组成的。假如是date[] 数组。而上面的list.add(str1)的意思是 date[0]=str1所指向的对象。所以date[m]指向的也就是某一个地址,不会受到改变。然后str1指向了另外一个地址,也就是跟date[0]没有关系。也就是某些大神说的,只有值传递,没有引用传递。
      

  13.   

    在java里面,只有值传递,没有引用传递。
      

  14.   

    "aa"相当于一个地址,将这个地址放入到了ArrayList里,然后让str指向另一个地址"bb",但是存入到ArrayList的地址还是指向对象"aa"