import java.util.*;public class TestArrayList{
  public static void main(String args[]){
     List<String> li=new ArrayList<String>();
     String s="hello";
     li.add(s);
     s="world";
     li.add(s);
     for(int i=0;i<li.size();i++){
        System.out.println(li.get(i));
     }
  }
}
s指向的内容改变,容器里面保存的是引用,为什么不跟着改变?怎么输出还是“hello”、“world”?
为什么不是“world”、“world”?

解决方案 »

  1.   

    String s="hello";
                li.add(s);
                s="world";  这个s 已经是一个新对象了!
                li.add(s);
      

  2.   

    第一次加的是hello的地址
    第二次加的是world的地址,和变量的名字无关
      

  3.   

     s="world";
    这句话,s的指向发生了变化,原来指向"hello",被add之后,s和li内都存在一个引用指向"hello",然后s又指向了"world",而li内的引用并不是s,而是s的一个拷贝而已,不会随之变化,之后的事情,我相信你已经能够理解了
      

  4.   

    s="world";
    这句话,s的指向发生了变化,原来指向"hello",被add之后,s和li内都存在一个引用指向"hello",然后s 又指向了"world",而li内的引用并不是s,而是s的一个拷贝而已,不会随之变化,之后的事情,我相信你已经能够理解了
      

  5.   

    值传递看成有个虚拟的指针而已。容器里存的是值,不是地址。
    你的代码就相当于下面的代码:import java.util.*;public class TestArrayList{
          public static void main(String args[]){
                List<String> li=new ArrayList<String>();
                String s=new String("hello");
                System.out.println(s.hashCode());
                li.add(s);
                s=new String("world");
                System.out.println(s.hashCode());
                li.add(s);
                for(int i=0;i<li.size();i++){
                      System.out.println(li.get(i));
                }
          }
    }
      

  6.   

    建议 lz  查阅 String 的"不可变性"的相关知识点
      

  7.   

    [Quote=引用 8 楼 id19870510 的回复:]
    建议 lz 查阅 String 的"不可变性"的相关知识点
    [/Quote这个和String的变不变关系不大,换做是任何一种其它对象还是这种结果
      

  8.   

    这个和String的变不变关系不大,换做是任何一种其它对象还是这种结果
      

  9.   

    list加的是引用,你第一次加的是“hello”的引用,“hello”本身就是一个对象。相当于你加的"hello",本身这个引用,并非是对象S,当你第二次重新给S赋值的时候只是相当于你改变的S这个对象,你并非改变了字符串“Hello”这个对象,所以你第二次加的是"world"就输出hello world了,这是跟string对象不可变的特性有关系,改变值就改变对象,也就改变引用,所以楼主你不能改变对象的引用,如果楼主你这样做,写个简单代码
    class User {
      String name;
    }
    List<User> users = new  ArrayList<User>(); 
    User user = new User("jack");
    users.add(user);
    user.setName("divided");
    user.add(user);
    for(int i=0;i<2;i++){
        System.out.println(users.get(i).getName())
    }
      

  10.   

    “容器里保存的是引用”
    没错,所谓引用,可以想象成地址你第一次加入了一个地址到容器
    第二次又加入了一个地址到容器
    你get的时候容器根据你放的两个地址去找对象,有什么问题?!
      

  11.   

    也就是说list里现在存储的就是两个字符串 一个hello 另一个 就是world输出的时候一个个输出 不就是hello world吗?
      

  12.   

    其实,在java中是没有指钟的。上面的全部是应用。添加到时候没有添加到实体。word并没有被s传入。只是他在执行s = "word"的时候是有s指向了word。word是在缓冲区中,并没有在内存中。
    如果你要添加到的话。一定要new