我正在使用 Java 和 MySQL。
我的项目中有大约 60 个交易屏幕。我曾经用过add()
and addAll()
复制的功能ArrayList
.
例如:
List<Bean> a1 = new ArrayList<Bean>(); // and add some value
List<Bean> a2 = new ArrayList<Bean>();
a2.addAll(a1);
在这种情况下:
- 在大多数屏幕上,没有任何问题
add()
or addAll()
功能,但对于某些屏幕,如果在列表上进行更改a2
它也影响a1
list.
- 在这些特定的屏幕中,克隆概念(实现
Cloneable
接口)用于摆脱它并且它工作正常。
根据我的研究,add()
函数仅设置对目的地列表的引用。
我的疑问是:
- Why
clone()
是必需的(仅适用于某些情况,并非全部)?
- 如果我们实际上会发生什么
add()
or addAll()
将一个列表放入另一个列表中?
- 无论,
clone()
是强制性的add()
or addAll()
方法与否?
- 我们应该在哪里使用
clone()
哪里不应该?
- 列表中应该发生什么
a1
如果我们对列表进行任何更改a2
?
我的最后一个问题:
何时使用clone()
或复制构造函数以及当我们不需要时使用。
并在一般情况下List
,如果我们像上面的示例一样对目标列表进行更改,源列表会发生什么情况。
Yes, addAll
将源列表的所有引用添加到目标列表。它不会创建这些引用引用的实例的副本。
当 List 保存对不可变对象的引用时,这就足够了。如果您在某个列表之后添加或删除元素addAll
操作时,所做的更改不会反映在其他 List 中。
如果 List 保存对可变对象的引用,并且您正在修改这些对象的状态,并且不希望一个 List 中的更改反映在另一个 List 中,则必须创建副本(使用克隆或复制构造函数)。
顺便说一句,将列表传递给add
(而不是addAll
) 会将 List 的引用添加到目标 List。除非目标列表是列表列表,否则您不应该这样做。add
应该接受要添加到列表中的单个元素。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)