java复合对象的复制有关问题(浅拷贝和深拷贝)
java复合对象的复制问题(浅拷贝和深拷贝)
今天遇到了个奇怪的问题,郁闷了好一会儿,原因是我的基础太差,基本概念也不了解.
事情是这样的, 举个小例子,比如说:
int a=3; int b=a; b=4; System.out.println("a="a);
显然应该打印"a=3". 尽管b是a的复制,对b作的改变仍然不会影响到a.
对于int这样的简单类型是这样,但对于复合对象恐怕不不是了.
对于下面的代码:
Stack stack1=new Stack(); stack1.push(1); stack1.push(2); stack1.push(3); stack1.push(4); Stack stack2=stack1; System.out.println("stack2做一次pop前的stack1:"+stack1); stack2.pop(); System.out.println("stack2做一次pop后的stack1:"+stack1);
正确的打印结果是:
stack2做一次pop前的stack1:[1, 2, 3, 4] stack2做一次pop后的stack1:[1, 2, 3]
刚看到这个运行结果时我郁闷的不行.显然stack1一旦把自己复制给别人,stack2和stack1操纵的就是同一份对象了. 多个变量竟然能够同时操纵同一个对象,虽然这貌似是java里的常识.基础差的我难怪要大惊小怪.唉.
如果想实现每个变量都各自操纵自己的Stack对象,一个方法是使用clone方法,将上面代码中的赋值语句改成这样:
Stack stack2=(Stack)stack1.clone();
具体原因现在我才知道,大概就是深拷贝和浅拷贝的问题.
Stack类里的clone函数介绍:
public Object clone() 返回向量的一个副本。副本中将包含一个对内部数据数组副本的引用,而非对此 Vector 对象的原始内部数据数组的引用。 覆盖: 类 Object 中的 clone 返回: 向量的一个副本 另请参见: Cloneable
待参考资料:
http://www.iteye.com/topic/483469
http://syue.com/Software/JAVA/15617.html
http://chenkegarfield.blog.163.com/blog/static/623300082010101594154119/