《The Design Patterns-Java Companion》这本书里面有介绍关于深复制和浅复制的内容,是在creational patterns中的prototype pattern这一节里,page 45,在复制一个很大的对象时,为了减少开销,通过prototype模式中的方法来复制而不是new对象,这是一种深复制的方法;而浅复制是指两个reference指向同一块内存的堆空间,这容易产生memory leaking问题。

解决方案 »

  1.   

    比如下面的代码,能否帮忙解释一下呢?
    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?
      

  2.   

    呵呵
    thinking in java的附录正好有一篇很长的文章讲述这个问题。去看看吧。
      

  3.   

    自己看 java高效编程 clone 一章,讲的很详细.而且这本书绝对的java经典,不看这本书,你的java程序肯定不咋地 :)
      

  4.   

    WrappedValue类里由于你没有复写public boolean equals(Object a)方法,所以默认情况下用了WrappedValue的超类Object的equals方法,而这个方法比较的是两个对象的内存地址,所以当然返回false.如果你要根据i进行比较,要重写equals方法.
    Integer里的equals比较的是封装的整型值,所以返回true.
      

  5.   

    /** 克隆一个参数中输入的INode节点的对象并返回.
         * 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;
            }
        }
      

  6.   

    深层clone, hashcode的不一样的哦~ 呵呵``
      

  7.   

    只要两个对象equals,hashCode就应该相等.
    无论是clone,还是序列化/反序列化都不应该破坏这个约定.,