《The Design Patterns-Java Companion》这本书里面有介绍关于深复制和浅复制的内容,是在creational patterns中的prototype pattern这一节里,page 45,在复制一个很大的对象时,为了减少开销,通过prototype模式中的方法来复制而不是new对象,这是一种深复制的方法;而浅复制是指两个reference指向同一块内存的堆空间,这容易产生memory leaking问题。
调试欢乐多
class WrappedValue {
int i;
}
public class EqualsFail {
public static void main(String[] args) {
WrappedValue value1 = new WrappedValue();
WrappedValue value2 = new WrappedValue();
value1.i = 123;
value2.i = 123;
System.out.println(value1.equals(value2));
}
}
为什么输出false?
public class EqualsSuccess {
public static void main(String[] args) {
Integer value1 = new Integer(123);
Integer value2 = new Integer(123);
System.out.println(value1.equals(value2));
}
}
为什么输出true?
thinking in java的附录正好有一篇很长的文章讲述这个问题。去看看吧。
Integer里的equals比较的是封装的整型值,所以返回true.
* add by mengwei for clone node!
* @param node 需要克隆的对象
* @return 返回一个克隆对象
* @throws Exception 一般是返回IOException异常.
*/
public static INode getCopyNode(INode node) throws Exception
{
try
{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
out.writeObject(node);
out.close();
ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
ObjectInputStream in = new ObjectInputStream(bin);
Object ret = in.readObject();
in.close();
return (INode)ret;
}
catch(Exception e)
{
throw e;
}
}
无论是clone,还是序列化/反序列化都不应该破坏这个约定.,