Использует ли java.lang.System.arraycopy () поверхностную копию? - PullRequest
0 голосов
/ 23 мая 2011

System.arraycopy() - метод поверхностного копирования.

Для массива примитивного типа он скопирует значения из одного массива в другой:

int[] a = new int[]{1,2};
int[] b = new int[2];
System.arraycopy(a, 0, b, 0, 2);

b теперь будет {1,2}.Изменения в a не затронут b.

Для массива непримитивного типа он скопирует ссылки объекта из одного массива в другой:

MyObject[] a = new MyObject[] { new MyObject(1), new MyObject(2)};
MyObject[] b = new MyObject[2];
System.arraycopy(a, 0, b, 0, 2);

b будет содержать ссылку new MyObject(1), new MyObject(2) сейчас.Но если в a будут внесены какие-либо изменения в new MyObject(1), это также повлияет на b.

Правильны ли вышеуказанные утверждения или нет?

Ответы [ 2 ]

0 голосов
/ 23 мая 2011

Приведенные выше утверждения верны или нет?

Да, вы правы.

System.arraycopy всегда делает поверхностную копию , независимо от того, содержит ли массив ссылки или примитивы, такие как int s или doubles s.

Изменения в массиве a никогда не повлияют на массив b (если, конечно, a == b).

Но если какие-либо изменения нового MyObject (1) в a, это также повлияет на b.

Зависит от того, что вы имеете в виду. Чтобы быть разборчивым, изменение new MyObject(1) не повлияет ни на a, ни b (поскольку они содержат только ссылки на объект, а ссылка не изменяется ). Изменения будут видны как с a, так и с b, независимо от того, какую ссылку вы используете для изменения объекта.

0 голосов
/ 23 мая 2011

Вы правы, если вы специально изменяете свойства и вызываете методы для своих объектов.

Если вы измените расположение контрольных точек, например, с помощью a[0] = new MyObject(1), то даже если объектысозданные с теми же данными инициализации, они теперь будут указывать на разные экземпляры объекта, а изменение одного экземпляра не будет видно в другой ссылке (в массиве b).

...