Используя clone() vs new obj

Я смотрю Cracking the Code Interview и в этой проблеме. Я должен найти все пути в двоичном дереве, которое имеет сумму заданного числа. Я вообще понимаю этот код, но мне интересно, почему ответ использует clone() вместо создания нового объекта с new?

public static void findSum(BinaryTreeNode root, int sum, ArrayList<integer> buffer, int level) {
 // done parsing or empty tree
 if (root == null) {
 return;
 }
 int tmp = sum;
 buffer.add(root.value);
 for (int i = level; i >= 1; i--) {
 tmp -= buffer.get(i);
 if (tmp == 0) {
 print(buffer, i, level);
 }
 }
 ArrayList<integer> c1 = (ArrayList<integer>) buffer.clone();
 ArrayList<integer> c2 = (ArrayList<integer>) buffer.clone();
 findSum(root.left, sum, c1, level + 1);
 findSum(root.left, sum, c2, level + 1);
}
public static void print(ArrayList<integer> bugger, int level, int i2) {
 for (int i = level; i <= i2; i++) {
 System.out.print(buffer.get(i) + " ");
 }
 System.out.println();
}
</integer></integer></integer></integer></integer></integer>
4 ответа

Это преждевременная микро-оптимизация, связанная с тем, что клонирование происходит немного быстрее (вот ответ с подробностями о том, почему клонирование быстрее для списков массивов).

Решение с более чистым видом

ArrayList<integer> c1 = new ArrayList<integer>(buffer);
</integer></integer>

легче понять, не требует приведения, и это вряд ли приведет к какой-либо измеримой разнице в производительности.


В этом случае нет причин предпочитать clone(). new ArrayList<integer>(buffer)</integer> также будет работать так же хорошо.

Но ситуация не может быть одинаковой для классов, отличных от коллекций. clone обычно используется, когда нет конструктора, который дублирует объект, но в любом случае требуется дубликат.


Вы можете создать новый объект ArrayList и добиться тех же результатов. Хорошая практика программирования (хотя и не обязательно применимая к этой ситуации) заключается в том, чтобы работать с копиями исходных объектов, а clone() предоставляет это все время через неявное наследование класса Object. Таким образом, возможная причина, по которой они использовались, заключается в том, что это наиболее часто используемые методы для дублирования объекта. Когда вы думаете об этом, это немного компактнее.


Оператор

new создает экземпляр нового объекта, а clone() больше похож на конструктор копирования. clone() метод создает копию объекта со значениями member attributes also copied.

licensed under cc by-sa 3.0 with attribution.