JAVA容器存放的是JAVA对象的reference,但是在java中,你的前后两个S确实上两个不同的java对象,是存放在heap 里不同区域的,所以他们的reference也是不同的,如果你改成s="";这样也许结果就不一样了,如果他们就是同一个reference了,

解决方案 »

  1.   

    你的是“new String”
    了解??!!!
      

  2.   

    String对象的值是常量,不能修改,如果重新赋值的话,实际上重新产生了另一个对象
    而原来的对象引用只存在Vector中,所以会出现这种情况,如果是StringBuffer对象则
    会与楼住想象的结果一样
      

  3.   

    不管你的第二个s怎么改,输出结果是不会变的,首先你先创建一个String,JVM就给它分配一块内存,然后你再创建一个Vector,JVM又分一块内存给Vector,而你向Vector中增加元素的时候,Vector会动态的动申请一块内存来存放新增的数据,所以这些变量的值全在不同的内存块中,不会因为你改变了一个,别的就会改变的。不要和C++搞混了。
      

  4.   

    drugon(personal)说的好,也给偶好好上了一课!
      

  5.   

    我认为:
    首先Vector里存放的是引用,s也是引用
    v1.add(s)的作用是在v1中插入一个引用,这个引用指向“this is a String”(注意:不是指向s)
    在执行s = new String("this is a new String")后,s已指向"this is a new String",而Vector中的两个引用仍然指向“this is a String”
    输出当然是两个“this is a String”了
      

  6.   

    还是那句话 ,String 是比较特殊的
    无论你是s = new String("this is a new String");
    或者是 s="this is a new String";打印的结果应该还是
    this is a String
    this is a String
      

  7.   

    不好意思,上述说法不太准确,应该是这样理解
     String tmp1 = new String("this is a String");
     s=tmp1;
     v1.add(s);
     v1.add(s); 相当于保存tmp1;
     
     String tmp2 = new String("this is a new String");
     s=tmp2;
    v1 中的引用还是tmp1,没有改变。
      

  8.   


    import java.util.*;public class test {
        public static void main(String[] argv)throws Exception{
         Vector v=new Vector();
    A a=new A();
    v.add(a);//=99
    a.a=100;
    A a2=(A)v.get(0);
    System.out.println(a2.a);//=100
    }
    }
    class A{
    public int a=99;
    }
    //////////////////////////////////////////////
    而s = new String("this is a new String");或s="this is a new String";
    都是把 s指向了新的内容,不影响vetor.




    }



    }

    class A{
    public int a=99;
    }
      

  9.   

    jxc1999() 
    liudongbaollz() 
    zealVampire(蚊子+鹤舞白沙)
    我认同以上三位的解释,尤其是jxc1999() 我觉得就是标准答案了:)