我还是一个刚接触过Java的新手,你能告诉我这两个构造函数之间的区别吗?
第一:
public class Plan
{
ArrayList<Point2D> points;
public Plan(ArrayList<Ponto2D> points)
{
this.points = new Arraylist<Point2D>(points);
}
}
并且: 第二:
public class Plan
{
public Plan(ArrayList<Point2D> lpoints)
{
points = new ArrayList<Point2D>();
for(Point2D p : lpoints) point.add(p.clone());
}
}
答案 0 :(得分:5)
第一个构造函数是浅层副本,第二个是深层副本。
S.Lott对this question给出的答案。
浅拷贝尽可能少复制。浅的副本 集合是集合结构的副本,而不是元素。 通过浅拷贝,两个集合现在共享个人 元件。
深拷贝复制一切。集合的深层副本是两个 包含原始集合中所有元素的集合 复制。
答案 1 :(得分:3)
this.points = new Arraylist<Point2D>(points);
这需要整个集合并使用该集合来初始化points
ArrayList。
for(Point2D p : lpoints) point.add(p.clone());
结果相同但将lpoints
- 集合的每个元素逐一添加到points
列表中。
因此,对于您的使用,请使用第一种可能性。
答案 2 :(得分:1)
在第一种情况下,参数ArrayList共享相同的点(p1.equals(p2)将为true,p1 == p2将为true) 在第二种情况下,它们有不同的点副本(p1.equals(p2)将为真,但p1 == p2将为假)
答案 3 :(得分:1)
在第一个构造函数中,您使用默认的Java构造函数来创建一个以集合作为参数的ArrayList。
public ArrayList(Collection&lt;?extends E&gt; c)
按照集合迭代器返回的顺序构造一个包含指定集合元素的列表。
这与编写自己的迭代器基本相同(来自您的示例)。
public Plan(ArrayList<Point2D> lpoints) {
points = new ArrayList<Point2D>();
for(Point2D p : lpoints)
point.add(p.clone());
}
在这个例子中,我们使用一个名为.clone()的方法,因为我们不希望每个对象都是浅层副本。我们想复制它们。
[编辑]:两个例子都不做同样的事情。第一个是浅拷贝,第二个是深拷贝。