Назначение объектов в Java - PullRequest
3 голосов
/ 10 июля 2011

У меня есть такой код:

this.elements = elements;

Где elements является List. Список скопирован или это просто указатель, и оба будут представлять один и тот же список?

Ответы [ 5 ]

13 голосов
/ 10 июля 2011

Это еще одна ссылка , и оба представляют один и тот же список.В Java понятие указателя скрыто для программиста.Только JVM имеет дело с указателями.

5 голосов
/ 10 июля 2011

И this.elements, и элементы являются просто идентификаторами одного и того же списка, он не будет скопирован

2 голосов
/ 10 июля 2011

Оба будут представлять один и тот же список, все объекты в Java являются ссылками и передаются как таковые, поэтому изменение объекта изменяется через ссылку.

0 голосов
/ 10 июля 2011

По сути, это «копия указателя». Правильная номенклатура в Java - ссылка , а не указатель . Существенным отличием является то, что значение ссылки Java не является адресом памяти, оно указывает непосредственно на объект в куче JVM.

Если вы хотите получить копию, у вас есть несколько вариантов, но, возможно, лучший из них:

this.elements = ImmutableList.copyOf(elements);

Этот метод использует Google Guava для создания списка, который нельзя изменить. Если вы хотите список, который вы можете изменить, сделайте это вместо:

this.elements = Lists.newArrayList(elements);

Существует также «встроенный» метод clone(), но , в котором есть несколько ловушек, на которые следует обратить внимание (Effective Java, 2nd ed., Item 10) .

0 голосов
/ 10 июля 2011

Как уже говорили другие, он будет только копировать ссылку. Если вы хотите скопировать фактический список, вам нужно вызвать метод clone():

this.elements = elements.clone();

Примечание: будет ли это иметь желаемый эффект или нет, все еще зависит от того, какие объекты в списке есть, так как они сами могут быть ссылками на изменяемые объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...