我的问题是我需要复制列表,但需要复制深层副本。修改列表link
时,我不想修改列表void freeHashData(void* data){
hash_elem* data2=(hash_elem*) data;
msg_list* tmp=data2->msg_head;
while (tmp != NULL) {
msg_list* next = tmp->next;
free(tmp->msg->data.buf);
free(tmp->msg);
free(tmp); /* you missed that */
tmp = next;
}
free(data2->nickname); /* you missed that */
free(data2);
}
。我使用JDK11,因此可以使用a
,但是在修改b
时使用它,list.copyOf
也被修改了。我在做错什么吗?
a
该分配的输出:
答案 0 :(得分:1)
copyOf方法不会进行深层复制,根据documentation,它会返回一个非可变视图,即只读列表。它不会复制列表中的元素。要进行深层复制,您基本上需要遍历集合并将元素逐个深层复制到新集合中。在一般情况下,这可能很棘手。有些对象支持克隆,另一些对象具有自定义的复制方法,但是在一般情况下,Java没有始终有效的深度复制方法。
简而言之,解决方案取决于列表中的内容。由于它似乎是您应用程序中的自定义对象,因此最简单的方法就是遍历列表,然后使用您在类中提供的复制构造函数或克隆方法将实例复制到新列表中。