在使用Java完成数据结构结点的构造时,遇到了数据域虽然也拷贝了,但只是浅层拷贝,两个不同的变量指向了同一块地址。也就是我将数据域中的T设置为引用类型后就会出现这种情况。
1 2 3 4 5 6 7 8 9 10
| public class Node<T> //结点类 { public T data; public Node<T> next; public Node(T data, Node<T> next) { this.data = data; this.next = next; } }
|
在经过Debug之后,发现了问题所在,然后结合Java中ObjectOutputStream和ObjectInputStream这两种流完成对象的深拷贝,这是序列化和反序列化的一种应用。
ObjectInput接口与ObjectOutput接口分别继承了DataInput接口和DataOutput接口,提供了对基本数据类型和对象序列化的方法。使用对象序列化功能可以非常方便的将对象写入输出流,或者从输入流中读取对象。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public class Node<T> { public T data; public Node<T> next;
public Node(T data, Node<T> next) { try { ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(data); ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); @SuppressWarnings("unchecked") T data1 = (T) oi.readObject(); this.data = data1; } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } this.next = next; } }
|