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在后台为对象创建引用,在数组列表
的情况下,复制构造函数
和克隆方法
都有助于在没有引用的情况下创建新的数组列表当然,请注意,源代码不必是规范的。任何人都可以实现标准库,只要他们做正确的事情。这意味着