Java LinkedList为何要重写clone()方法

cuurry 2018-06-12 10:22:14
我看到Java中LinkedList类中,clone()方法的源码如下:
    @SuppressWarnings("unchecked")
private LinkedList<E> superClone() {
try {
return (LinkedList<E>) super.clone();
} catch (CloneNotSupportedException e) {
throw new InternalError(e);
}
}

/**
* Returns a shallow copy of this {@code LinkedList}. (The elements
* themselves are not cloned.)
*
* @return a shallow copy of this {@code LinkedList} instance
*/
public Object clone() {
LinkedList<E> clone = superClone();

// Put clone into "virgin" state
clone.first = clone.last = null;
clone.size = 0;
clone.modCount = 0;

// Initialize clone with our elements
for (Node<E> x = first; x != null; x = x.next)
clone.add(x.item);

return clone;
}

superClone()方法中的super.clone()方法不就已经返回了一个LinkedList的shallow copy对象吗?
为什么还要重写clone()方法?还要在这个方法中,将返回的clone对象重置,再用原始list中的数据进行初始化?
难道super.clone()返回的对象没有数据?
还是重写之后,clone()方法返回了deep copy对象?
...全文
2905 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2018-06-12
  • 打赏
  • 举报
回复 1
就是为了深拷贝
stacksoverflow 2018-06-12
  • 打赏
  • 举报
回复
linklist的clone方法中重新生成一份链表 Node→Node→Node→Node→Node 如果之调用父类的clone方法,则会重用原来的first和last以外的node 参见linklist的add方法,每次都new Node, 但实际上linklist之保留了first和last属性,所以object的clone方法并不会重新new first和last以外的节点。 这么说满足了不?
zzywjing 2018-06-12
  • 打赏
  • 举报
回复
应该是做深拷贝吧
cuurry 2018-06-12
  • 打赏
  • 举报
回复
有没有大神,帮忙解决一下疑问,或者探讨一下看法也行
stacksoverflow 2018-06-12
  • 打赏
  • 举报
回复
问题解决的话麻烦结个贴。
stacksoverflow 2018-06-12
  • 打赏
  • 举报
回复
上面是浅拷贝这句话删掉
stacksoverflow 2018-06-12
  • 打赏
  • 举报
回复
LinkedList list1 = new LinkedList(); list1.add(new Object()); list1.add(new Object()); list1.add(new Object()); LinkedList list2 = (LinkedList)list1.clone(); list1.removeLast(); for(Object item:list1) { System.out.print(item + ","); } System.out.println(); for(Object item:list2) { System.out.print(item + ","); } 运行结果 java.lang.Object@7852e922,java.lang.Object@4e25154f, java.lang.Object@7852e922,java.lang.Object@4e25154f,java.lang.Object@70dea4e, 注意:存储的东西都一样,但是Node是两套,所以我把第一个链表去尾后,不影响第二个链表。 浅拷贝: Node1(itemA)→Node2(itemB)→Node3(itemC) Node4(itemA)→Node5(itemB)→Node6(itemC) 深拷贝: Node1(itemA)→Node2(itemB)→Node3(itemC) Node4(itemD)→Node5(itemE)→Node6(itemF) 上面是浅拷贝 虽然“深拷贝”了Node,但是对调用者来说Node是透明的,所以注释写成浅拷贝。
cuurry 2018-06-12
  • 打赏
  • 举报
回复
引用 7 楼 stacksoverflow 的回复:
[quote=引用 6 楼 stacksoverflow 的回复:] [quote=引用 5 楼 weixin_41734200 的回复:] clone()方法是做了深拷贝,但为什么clone()方法的注释是Returns a shallow copy of this LinkedList。是有什么其他含义吗?
深拷贝指的是对象属性所引用的对象全部进行新建对象复制,linkedList,显然没有。 linkedList对自己的node都作了new操作,但对每个Node中的对象并没有作new操作。[/quote] 因为Node对使用者是不可见的,对于你看见的里面的对象,并没有new操作,所以注释给你做浅拷贝。 [/quote] 就是说新的list中的node只是通过原始list中node的item创建出来的,新list中的node独立于原始list中的node,这两类node之间不存在clone关系,所以clone()方法返回的list还是shallow copy实例。是这个意思吗?
stacksoverflow 2018-06-12
  • 打赏
  • 举报
回复
引用 6 楼 stacksoverflow 的回复:
[quote=引用 5 楼 weixin_41734200 的回复:] clone()方法是做了深拷贝,但为什么clone()方法的注释是Returns a shallow copy of this LinkedList。是有什么其他含义吗?
深拷贝指的是对象属性所引用的对象全部进行新建对象复制,linkedList,显然没有。 linkedList对自己的node都作了new操作,但对每个Node中的对象并没有作new操作。[/quote] 因为Node对使用者是不可见的,对于你看见的里面的对象,并没有new操作,所以注释给你做浅拷贝。
stacksoverflow 2018-06-12
  • 打赏
  • 举报
回复
引用 5 楼 weixin_41734200 的回复:
clone()方法是做了深拷贝,但为什么clone()方法的注释是Returns a shallow copy of this LinkedList。是有什么其他含义吗?
深拷贝指的是对象属性所引用的对象全部进行新建对象复制,linkedList,显然没有。 linkedList对自己的node都作了new操作,但对每个Node中的对象并没有作new操作。
cuurry 2018-06-12
  • 打赏
  • 举报
回复
clone()方法是做了深拷贝,但为什么clone()方法的注释是Returns a shallow copy of this LinkedList。是有什么其他含义吗?

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧