Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 克隆方法存在时复制构造函数的用途?_Java_Arraylist_Reference_Clone_Copy Constructor - Fatal编程技术网

Java 克隆方法存在时复制构造函数的用途?

Java 克隆方法存在时复制构造函数的用途?,java,arraylist,reference,clone,copy-constructor,Java,Arraylist,Reference,Clone,Copy Constructor,从我知道的结果 ArrayList<Object> listClone = new ArrayList<Object>(list); ArrayList listClone=新的ArrayList(列表); 在幕后比 @SuppressWarnings("unchecked") ArrayList<Object> listClone = (ArrayList<Object>)list.clone(); @SuppressWarnings(“未

从我知道的结果

ArrayList<Object> listClone = new ArrayList<Object>(list);
ArrayList listClone=新的ArrayList(列表);
在幕后比

@SuppressWarnings("unchecked")
ArrayList<Object> listClone = (ArrayList<Object>)list.clone();
@SuppressWarnings(“未选中”)
ArrayList listClone=(ArrayList)list.clone();
但结果是一样的。那么,当我们有一个克隆方法时,为什么还会有一个复制构造函数呢

注意:这个问题主要针对
ArrayList
,因为我知道它既有
Copy构造函数
又有
Clone方法
。如果有任何Java对象包含其中一个,但不是两个,那么我不知道这一点。不过,我的问题是针对
ArrayList
的情况

那么,它的目的是什么?在哪种情况下,您更愿意使用ArrayList的
复制构造函数
,而不是它的
克隆方法

PS:如果有人同时拥有
Copy构造函数
Java#ArrayList
Clone方法
的确切代码进行比较,那就太好了

那么,它的目的是什么

查看复制构造函数的签名:

   ArrayList(Collection<? extends E> c)
ArrayList(集合
那么,它的目的是什么

查看复制构造函数的签名:

   ArrayList(Collection<? extends E> c)

ArrayList(Collection据我所知有一点不同。复制构造函数接受一个集合,而不仅仅是一个ArrayList。它更像是一个“将所有内容填充到新的ArrayList”构造函数,而不是一个复制构造函数。元素的顺序也由给定集合的迭代器决定

另一方面,.clone()方法从给定的ArrayList中创建一个新的ArrayList

这两种工作方式不同的一种情况:

List a=new ArrayList();
List l=new LinkedList();

List a2 = new ArrayList(a); //returns ArrayList
List a3 = new ArrayList(l); //returns ArrayList
List a4 = a.clone();        //returns ArrayList
List a5 = l.clone();        //returns LinkedList

据我所知,有一点不同。复制构造函数接受一个集合,而不仅仅是一个Arraylist。它更像是一个“将所有内容填充到新Arraylist”构造函数,而不是一个复制构造函数。此外,元素的顺序由给定集合的迭代器决定

另一方面,.clone()方法从给定的ArrayList中创建一个新的ArrayList

这两种工作方式不同的一种情况:

List a=new ArrayList();
List l=new LinkedList();

List a2 = new ArrayList(a); //returns ArrayList
List a3 = new ArrayList(l); //returns ArrayList
List a4 = a.clone();        //returns ArrayList
List a5 = l.clone();        //returns LinkedList

据我所知,使用哪一个取决于您的设计意图,但是
clone()
方法通常被认为是不正确的。这可能是设计师添加适当副本构造函数的一个很好的原因

以下是一些优点和缺点:

  • clone()
    方法被认为会引起问题。首先,默认情况下,不清楚是深度副本还是浅层副本。如果在层次结构上调用
    super.clone()
    ,可能最终会得到可变对象的浅层副本,这不是您的意图
  • 有些人只对数组使用
    clone()
    ,因为这样会更快
  • Cloneable
    不清楚。如果某个东西是
    Cloneable
    ,它可能仍然不清楚您真正可以用它做什么,因为它没有公共的
    clone()
    方法,也没有
    对象
  • 复制构造函数具有处理泛型的优势(如Stephen C所示)
以下是一些有趣的资料:


然后,您要求提供ArrayList复制构造函数和克隆的源代码:

ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
 }


public Object clone() {
    try {
        @SuppressWarnings("unchecked")
         ArrayList<E> v = (ArrayList<E>) super.clone();
         v.elementData = Arrays.copyOf(elementData, size);
         v.modCount = 0;
         return v;
     } catch (CloneNotSupportedException e) {
         // this shouldn't happen, since we are Cloneable
         throw new InternalError();
     }
 }

ArrayList(Collection据我所知,使用哪一个取决于您的设计意图,但是
clone()
方法通常被认为是不正确的。这可能是设计师添加适当副本构造函数的一个很好的原因

以下是一些优点和缺点:

  • clone()
    方法被认为会引起问题。首先,默认情况下,不清楚是深度副本还是浅层副本。如果在层次结构上调用
    super.clone()
    ,可能最终会得到可变对象的浅层副本,这不是您的意图
  • 有些人只对数组使用
    clone()
    ,因为这样会更快
  • Cloneable
    不清楚。如果某个东西是
    Cloneable
    ,它可能仍然不清楚您真正可以用它做什么,因为它没有公共的
    clone()
    方法,也没有
    对象
  • 复制构造函数具有处理泛型的优势(如Stephen C所示)
以下是一些有趣的资料:


然后,您要求提供ArrayList复制构造函数和克隆的源代码:

ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
 }


public Object clone() {
    try {
        @SuppressWarnings("unchecked")
         ArrayList<E> v = (ArrayList<E>) super.clone();
         v.elementData = Arrays.copyOf(elementData, size);
         v.modCount = 0;
         return v;
     } catch (CloneNotSupportedException e) {
         // this shouldn't happen, since we are Cloneable
         throw new InternalError();
     }
 }

ArrayList(Collectioni被看到Java和指针在一起的标签吓坏了…(O_O)@nobalG当你看到NPE时你很害怕吗?@WojtekSurowka-yup-Man,NPE和ANR…都会让我失去我的记忆mind@nobalG-修正了,“指针”不是相关标记。@nobalG My bad.。正确的单词应该是
引用
,而不是
指针
。Java在后台为对象创建引用,在
数组列表
的情况下,
复制构造函数
克隆方法
都有助于在没有引用的情况下创建新的数组列表ce到最初的一个。看到Java和指针在一起时,我被标签吓坏了。(\u O)@nobalG你看到NPE时非常害怕吗?@WojtekSurowka-yup-Man,NPE和ANR…都会让我失去理智mind@nobalG-修正了,“指针”不是相关标记。@nobalG My bad.。正确的单词应该是
引用
,而不是
指针
。Java在后台为对象创建引用,在
数组列表
的情况下,
复制构造函数
克隆方法
都有助于在没有引用的情况下创建新的数组列表当然,请注意,源代码不必是规范的。任何人都可以实现标准库,只要他们做正确的事情。这意味着