1. 普通拷贝

基本类型复制,可以直接操作,属于值复制,是没问题的。

int apples = 5; 
int pears = apples; 

引用类型直接用等号赋值则会使得两个引用指向同一个对象。当通过一个引用对象修改数据时,另外一个引用的对象值也发生了改变。不能完成拷贝。因此就需要引入其他拷贝方法。

2.浅拷贝

通过重写object中的clone方法(需要继承Cloneable 然后重新clone方法,在clone方法里面调用父类的clone方法来完成对象初始化即可)完成需要拷贝对象的复制,但是,如果这个拷贝的对象中包含其他引用,则这个引用不会被真正的拷贝。

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

3.深拷贝

被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

实现上可以配合序列化技术来完成深拷贝,自己实现一个deepCopy方法(拷贝工厂)

//将以写方法写在需要被深拷贝的类中,注意所有的域要可串行化
public Object deepClone()   
{   
//将对象写到流里   
ByteArrayOutoutStream bo=new ByteArrayOutputStream();   
ObjectOutputStream oo=new ObjectOutputStream(bo);   
oo.writeObject(this);   
//从流里读出来   
ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray());   
ObjectInputStream oi=new ObjectInputStream(bi);   
return(oi.readObject());   
}   

4.总结

普通拷贝速度比较快,深拷贝速度较慢,浅拷贝在中间。根据自己需求选择。

参考资料:
http://www.jb51.net/article/62909.htm