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]
这样的结果?
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]
这样的结果?
这里只是引用a,并不是实际值,
所以你清空a后
a.add("33");
a.add("55");
b.add(a);
又引用了一次,所以b中的两次引用实际上是指向的同一个a
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);
2要点1:java基础,对象是以引用传送的
2:看下java.util.Vector.add(Vector)
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结构的数组。
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);
将指定元素添加到此向量的末尾。 boolean addAll(Collection<? extends E> c)
将指定 Collection 中的所有元素添加到此向量的末尾,按照指定 collection 的迭代器所返回的顺序添加这些元素。
但是toString()打印Collection时,会对打印出所有成员