我决定编写一个单链接列表,并制定了使内部链接节点结构不可变的计划。
不过我遇到了障碍。说我有以下链接的节点(来自先前的add
操作):
1 -> 2 -> 3 -> 4
并说我想附加一个5
。
为此,由于node 4
是不可变的,因此我需要创建的新副本4
,但将其next
字段替换为包含的新节点5
。现在的问题是3
参考旧的4
;没有附加的5
。现在,我需要复制3
,并替换其next
字段以引用4
副本,但是现在2
引用的是旧版本3
...
换句话说,要执行追加操作,似乎需要复制整个列表。
我的问题:
我的想法正确吗?有什么办法可以执行追加操作而不复制整个结构?
显然,“有效Java”包含以下建议:
类应该是不可变的,除非有充分的理由使它们可变。
这是变异性的好例子吗?
我认为这不是建议答案的重复,因为我不是在谈论清单本身。显然,它必须是可变的才能符合该接口(无需执行诸如在内部保留新列表并通过getter检索它的操作。不过,经过深思熟虑,即使这样也需要进行一些修改;将其保持在最低限度)。我说的是列表的内部是否必须不可变。
CopyOnWritexxx
用于多线程的极其昂贵的类。没有人期望收藏确实是不可变的(尽管它确实会造成一些怪癖)