2015-02-23 3 views
0

У меня есть вопрос об использовании LinkedList и операции .get(). Java, как я понимаю, передает объекты по ссылке, поэтому, если у меня есть связанный список с именем A, и я делаю temp B = A.get(i), я извлекаю объект B, который я могу изменить, и изменения отражаются в A.get(i).Java LinkedList.get() не возвращает глубокую копию?

Однако, если объект B имеет внутри него (скажите еще один объект LinkedList), я не получу глубокую копию правильно? Является ли решение, что я должен создать конструктор копирования для моего temp класса в этом примере. Или есть лучший, встроенный способ сделать это?

Благодарим за помощь.

+11

_Java, насколько я понимаю, передает объекты по ссылке_. Нет. Java не передает объекты вообще, не говоря уже о ссылках. –

+4

Начать разграничение между переменными, значениями и объектами. –

+3

@SotiriosDelimanolis Грустно, как часто его учат именно так. Вы, конечно, правы. – jpmc26

ответ

4

Java, как я понимаю, передает объекты по ссылке ..

No. Java передать все по значению. Если у вас есть ссылочный тип, значение передается по значению. См. this question.

Если у меня есть связанный список, называемый A, и я делаю temp B = A.get (i), я извлекаю объект B, который я могу изменить, и изменения отражены в A.get (i).

Если у вас есть список ссылочных типов, то get(i) вернет ссылку на конкретный экземпляр. Элемент в списке и полученная ссылка будут ссылаться на тот же объект . Поэтому, если вы каким-то образом измените объект, он будет «видимым» из обеих ссылок.

Однако, если объект B имеет внутри него (скажем, другой объект LinkedList), я не получаю глубокую копию правильно?

Исправить. Вы получите ссылку.

Является решением, что я должен создать конструктор копирования для моего класса temp в этом примере. Или есть лучший, встроенный способ сделать это?

Если вам нужна глубокая копия вашего объекта, вы должны реализовать ее самостоятельно.

4

Java, как я понимаю, передает объекты по ссылке

No. Он передает ссылки на значение. Он вообще не пропускает объекты [за исключением случая RMI.]

поэтому, если у меня есть связанный список A, и я делаю temp B = A.get (i), я извлекаю объект B

Нет, вы извлечь ссылку, который ссылается на B. Тот же B, чьи ссылки вы прошли, когда вы добавили его в список.

, который я могу изменить, и изменения отражены в A.get (i).

Да, см. Выше.

Однако, если объект B имеет внутри него (скажем, другой объект LinkedList), я не получаю глубокую копию правильно?

Исправить. Как и в первом случае. Никакой разницы.

Является решением, что я должен создать конструктор копирования для моего класса temp в этом примере.

Решение для чего? Я никогда не использовал конструктор копирования или метод clone() в Java с 1997 года. Какую проблему вы пытаетесь решить?

Или есть лучший, встроенный способ сделать это?

Что делать?

0

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

// Let's assume I have a custom object class called Student 
// Here the object is created and s now points to the new Student object 
Student s = new Student(); 

// Here I create another variable that points to the same object 
Student s2 = s; 

Эти две переменные указывают на один и тот же объект и любые изменения, которые одна переменная делает на объект затем будет отражено в другой.

Это связано с вашим примером. Если у вас есть LinkedList объектов, это на самом деле список указателей на объектов. Поэтому вызов get (2) в списке получит ссылку на третий объект в списке. Объектом, который ссылается на , является объект, а не копия. Таким образом, любые ссылки, переменные, методы и т. Д., Которые были в этом объекте, все равно будут.

Надеюсь, что ответ на ваш вопрос :)

Смежные вопросы