Vector a=new Vector();
Vector b=new Vector();
a.add("1");
a.add("2");
b.add(a);
现在b中:
[1,2]
a.clear();
a.add("33");
a.add("55");
b.add(a);
现在b中结果为
[33,55][33,55]
为什么是这样,二不是
[1,2][33,55]
如何得到
[1,2][33,55]
这样的结果?

解决方案 »

  1.   

    b.add(a);
    这里只是引用a,并不是实际值,
    所以你清空a后
    a.add("33");
    a.add("55");
    b.add(a);
    又引用了一次,所以b中的两次引用实际上是指向的同一个a
      

  2.   

    b中存放的是a的引用,a做什么操作都会影响到b~
      

  3.   

    在java中对象传送的是地址,而不是对象的值,当你两次b.add(a),其实是对同一个对象的两次操作,两次指向同一个内存地址,在输出值时是输出的同一个对象的值,也就是内存中的同一个物理地址。
      

  4.   

    Vector   a=new   Vector(); 
    Vector   b=new   Vector(); 
    a.add("1"); 
    a.add("2"); 
    b.add(a); 
    现在b中: 
    [1,2] 
    //a.clear(); 
    a = new Vector(); //you should new again
    a.add("33"); 
    a.add("55"); 
    b.add(a); 
      

  5.   


    2要点1:java基础,对象是以引用传送的
    2:看下java.util.Vector.add(Vector)
      

  6.   

    1楼正解!要明白,add(a)之后,实际上是把a引用关联上,对a的修改会影响到b。
      

  7.   

    补充一下。java类型分为基本类型和引用类型,前者分配在栈内存中,后者分配heap堆内存中,前者消耗的资源明显小于后者。基本类型变量间的赋值方式是值传递,例如:
    int a = 10;
    int b = a;
    b copy了a的一个副本,内容就是10。你针对a或b的修改都不会影响到另一个值:
    b = 20;
    输出后,a还是10,b是20。引用型变量间的赋值方式是传递引用,换句话说,就是共享实例,例如:
    Class A{
      public int i = 10;
    }
    public static void main(String args[]) {
      A a = new A();
      A b = a;
    }
    内存分配是这样的,在栈内存中存在两个引用型对象a和b,它们两个同时指向heap堆内存中包含了int i = 10的对象。如此,a与b便共享一个实例。任何针对a或b的修改都将影响到另一个对象:
    a.i = 100;
    输出a.i与b.i后,两者都为100。两者指向的那个对象的值i已经被修改为100了。
    这里要特别注意的是String类型的对象。它是一个引用类型,但它也是恒定的。
    String s = "123";
    创建了两个对象(相信在很多面试题中都出现过),一个对象是栈内存中的引用型对象s,它指向heap堆内存中的字符串对象"123"。
    你针对s的修改操作:
    s += "456";
    并没有修改heap堆内存中的字符串对象"123",而是s指向新的字符串对象"123456"。
    sun用StringBuffer实现了可修改的字符串对象,是一个char结构的数组。
      

  8.   

    java里面都是值传递,b只是引用了a,指向了a里面的内容,所以a变  b 全变
      

  9.   

    Vector   a=new   Vector();  
    Vector   b=new   Vector();  
    a.add("1");  
    a.add("2");  
    b.add(a);  
    现在b中:  
    [1,2]  
    //a.clear();  
    a = new Vector(); 
    a.add("33");  
    a.add("55");  
    b.add(a);
      

  10.   

    同意上面各位的看法,而且,楼主的本意是不是想把a的成员添加到b中,应该用addAll()方法,而不是add()方法吧,add()方法是把a对象加入到了b中,而不是把a对象中的成员加到b中,两者区别很大哦,看看jdk api doc: boolean add(E e) 
              将指定元素添加到此向量的末尾。  boolean addAll(Collection<? extends E> c) 
              将指定 Collection 中的所有元素添加到此向量的末尾,按照指定 collection 的迭代器所返回的顺序添加这些元素。 
    但是toString()打印Collection时,会对打印出所有成员
      

  11.   

    大家说的满有道理的,,~~就上这会事了,.collection 的迭代器在哪看到啊..我怎么没学过啊,..~~