Java 在手动复制上面使用array.clone()有什么好处吗

Java 在手动复制上面使用array.clone()有什么好处吗,java,clone,Java,Clone,是否有任何缺点或优点使用 public Loteria( int[] liczby) { this.liczby = liczby.clone(); } 而不是: public Loteria( int[] liczby) { this.liczby = new int[liczby.length]; for(int i = 0....) this.liczby[i] = liczby[i]; } 首先,第一个版本要短得多,可读性更强。这在编程时总是一个很大的

是否有任何缺点或优点使用

public Loteria( int[] liczby) {
   this.liczby = liczby.clone();
}
而不是:

public Loteria( int[] liczby) {
   this.liczby = new int[liczby.length];
   for(int i = 0....)
       this.liczby[i] = liczby[i];
}

首先,第一个版本要短得多,可读性更强。这在编程时总是一个很大的优势


至于性能,您应该始终首先分析,只有在看到瓶颈时才需要担心。但在现代虚拟机上,它们可能会以同样快的速度结束(不过,如果这很重要的话,您需要对其进行分析)。阵列克隆通常是通过一个内部版本实现的,但是VM可能会意识到第二个版本是等效的。

首先,第一个版本要短得多,可读性更强。这在编程时总是一个很大的优势


至于性能,您应该始终首先分析,只有在看到瓶颈时才需要担心。但在现代虚拟机上,它们可能会以同样快的速度结束(不过,如果这很重要的话,您需要对其进行分析)。阵列克隆通常通过内部实现,但VM可能会认识到第二个版本是等效的。

这两种方法都会创建阵列元素的浅拷贝,这意味着阵列中的元素仍将相互引用。如果您想要浅拷贝拷贝,请坚持
array.clone()

  • 可读性更强
  • 代码更少,使用标准JavaAPI
深度复制阵列

爪哇6+

this.liczby = Arrays.copyOf(liczby, liczby.length);
旧版本

System.arraycopy(liczby, 0, this.liczby, 0, liczby.length);
测试

Object[] original = { new Object(), null };
Object[] copy = new Object[2];
System.arraycopy(original, 0, copy, 0, original.length);
Object[] copy2 = Arrays.copyOf(original, original.length + 1);
copy2[1] = 2;
System.out.println(original[1]); // null
System.out.println(copy2[1]); // 2

这两种方法都会创建数组元素的浅拷贝,这意味着数组中的元素仍将相互引用。如果您想要浅拷贝拷贝,请坚持
array.clone()

  • 可读性更强
  • 代码更少,使用标准JavaAPI
深度复制阵列

爪哇6+

this.liczby = Arrays.copyOf(liczby, liczby.length);
旧版本

System.arraycopy(liczby, 0, this.liczby, 0, liczby.length);
测试

Object[] original = { new Object(), null };
Object[] copy = new Object[2];
System.arraycopy(original, 0, copy, 0, original.length);
Object[] copy2 = Arrays.copyOf(original, original.length + 1);
copy2[1] = 2;
System.out.println(original[1]); // null
System.out.println(copy2[1]); // 2

关于你的手写版本

优点:让您可以更好地控制代码

缺点:更难阅读和维护。与通用的
clone()
相比没有性能优势


我会尽你所能选择克隆()。

关于你的手写版本

优点:让您可以更好地控制代码

缺点:更难阅读和维护。与通用的
clone()
相比没有性能优势


我会尽你所能使用
clone()

这是一组灵长类动物。当然
System.arraycopy
也会产生相同的结果-
Arrays.copyOf
正在幕后调用它(正如我在对这个问题的评论中所说的)。你可以看到来源。在这一点上,您似乎只是对“深度复制”的含义感到困惑。基本上,深度复制也会复制底层对象,因此将元素与引用相等(
==
)进行比较是错误的。这就是问题所在,它不是深度克隆。没有人说数组是同一个引用。如何解释为什么将示例替换为
copy=(Object[])original.clone()产生相同的结果。1)您的测试只显示一个浅拷贝。“两个输出都是2”只有在阵列本身没有被复制的情况下才会发生。将复制阵列,但不会复制元素对象。
original
copy
copy2
的第一个元素都是对同一
对象的引用。2) 您链接的文章是不相关的,因为我的示例只使用
=
来比较
对象
s,而不是装箱原语(就像您出于某种原因决定的那样)。3) 在没有循环的情况下深度克隆数组的唯一方法是使用序列化(这在fgb链接的一篇帖子中讨论)。它是一个灵长类数组。当然
System.arraycopy
会产生相同的结果-
数组。copyOf
正在幕后调用它(正如我在对这个问题的评论中已经说过的)。你可以看到来源。在这一点上,您似乎只是对“深度复制”的含义感到困惑。基本上,深度复制也会复制底层对象,因此将元素与引用相等(
==
)进行比较是错误的。这就是问题所在,它不是深度克隆。没有人说数组是同一个引用。如何解释为什么将示例替换为
copy=(Object[])original.clone()产生相同的结果。1)您的测试只显示一个浅拷贝。“两个输出都是2”只有在阵列本身没有被复制的情况下才会发生。将复制阵列,但不会复制元素对象。
original
copy
copy2
的第一个元素都是对同一
对象的引用。2) 您链接的文章是不相关的,因为我的示例只使用
=
来比较
对象
s,而不是装箱原语(就像您出于某种原因决定的那样)。3) 在没有循环的情况下深度克隆数组的唯一方法是使用序列化(这在fgb链接的一篇文章中讨论)。请注意,您也可以使用(使用类型安全性包装对的调用)。相关:这是一行代码,而不是三行。请注意,您也可以使用(使用类型安全性包装对的调用).related:这是一行代码,而不是三行。@alex23 OP提供的第二个版本是深度副本,所以我猜他在寻找深度副本。@alex23 OP提供的第二个版本是深度副本,所以我猜他在寻找深度副本。