Различие между системой. Массив. CopyTo () и система. Массив. Клон ()

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

74
задан Amar Palsapure 13 February 2012 в 07:24
поделиться

5 ответов

Клон () метод возвращает новый массив (мелкая копия) объект, содержащий все элементы в исходном массиве. CopyTo () метод копирует элементы в другой существующий массив. Оба выполняют мелкую копию. Мелкая копия означает, что содержание (каждый элемент массива) содержит ссылки на тот же объект как элементы в исходном массиве. Глубокая копия (который не выполняет ни один из этих методов) создала бы новый экземпляр объекта каждого элемента, приводящего к различному, все же одинаковому объекту.

Так различие:

1- CopyTo require to have a destination array when Clone return a new array.
2- CopyTo let you specify an index (if required) to the destination array.
Редактирование:

Удаляют неправильный пример.

52
ответ дан Patrick Desjardins 24 November 2019 в 12:00
поделиться

Еще одно различие, не упомянутое до сих пор, - то, что

  • с Clone() целевой массив еще не должен существовать, так как новый создается с нуля.
  • с CopyTo() не только делает целевой массив, должен уже существовать, это должно быть достаточно большим для содержания всех элементов в исходном массиве от индекса, который Вы определяете как место назначения.
25
ответ дан Michael Burr 24 November 2019 в 12:00
поделиться

Оба выполняют мелкие копии, как @PatrickDesjardins сказал (несмотря на многие введенные в заблуждение души, которые думают, что CopyTo делает глубокую копию).

Однако CopyTo позволяет Вам копировать один массив в указанный индекс в целевом массиве, давая ему значительно больше гибкости.

21
ответ дан Peter Mortensen 24 November 2019 в 12:00
поделиться
object[] myarray = new object[] { "one", 2, "three", 4, "really big number", 2324573984927361 };

//create shallow copy by CopyTo
//You have to instantiate your new array first
object[] myarray2 = new object[myarray.Length];
//but then you can specify how many members of original array you would like to copy 
myarray.CopyTo(myarray2, 0);

//create shallow copy by Clone
object[] myarray1;
//here you don't need to instantiate array, 
//but all elements of the original array will be copied
myarray1 = myarray.Clone() as object[];

//if not sure that we create a shalow copy lets test it
myarray[0] = 0;
Console.WriteLine(myarray[0]);// print 0
Console.WriteLine(myarray1[0]);//print "one"
Console.WriteLine(myarray2[0]);//print "one"

источник

7
ответ дан 24 November 2019 в 12:00
поделиться

клон () используется для копирования только структуры данных / массива, которые он не копирует фактические данные.

copyto () копирует структуру, а также фактические данные.

-1
ответ дан 24 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: