ArrayList,java。这两个构造函数之间有什么区别

时间:2015-08-26 14:34:50

标签: java

我还是一个刚接触过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());
    }

}

4 个答案:

答案 0 :(得分:5)

第一个构造函数是浅层副本,第二个是深层副本

S.Lottthis 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。

From Java Docs

  

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()的方法,因为我们不希望每个对象都是浅层副本。我们想复制它们。

[编辑]:两个例子都不做同样的事情。第一个是浅拷贝,第二个是深拷贝。