Есть ли объект в коллекции не статичный? - PullRequest
1 голос
/ 23 июля 2011

Я искал, но не нашел хорошего ответа.

Я использовал объект ArrayList. Я создал объект экземпляра (пример объекта X), я использовал этот ArrayList в качестве параметра для объекта-конструктора X, но каждый раз, когда я создавал экземпляр объекта X, ArrayList включал старый значения, не создали новый ArrayList.

Мне нужно использовать метод add, например, arraylist. Это код:

public DataPacket(int hop, int TTL, ArrayList onetimevisit){
        this.hop = hop;
        this.TTL = TTL;
        this.visited = onetimevisit;
 }

в другом циклическом процессе DataPacket встретит объект NodeRandom:

public NodeRandom(int id){
        this.id = id;
}

, тогда DataPacket добавит идентификатор NodeRandom.

Есть ли объект в коллекции не статичный?

Ответы [ 3 ]

4 голосов
/ 23 июля 2011

Я полагаю, что ваша проблема связана с неверным предположением о том, как java передает объекты в качестве параметров при вызовах методов. Проверьте этот ответ: Является ли Java "передачей по ссылке" или "передачей по значению"?

1 голос
/ 23 июля 2011

Краткий ответ:

изменить

this.visited = onetimevisit;

на

this.visited = new ArrayList (onetimevisit);

Более длинный ответ:

ArrayLists не обязательно static.Я думаю, что вы ошибочно заключаете, что ArrayList должен был каким-то образом быть установлен на статическое состояние из-за того, что существует только одна копия ArrayList, когда вы передаете его так, как вы его передали.Следует понимать, что когда вы передаете объект в Java (например, ArrayList), вы передаете объекту ссылку .Ссылка - это нечто похожее на указатель в стиле C с тем отличием, что арифметика указателей не допускается.Когда вы вызываете метод и передаете объект, вызываемый метод просто получает копию ссылки, а не копию объекта.Аналогично, когда вы используете оператор =, чтобы назначить один объект другому, вы только назначаете ссылки равными друг другу, и все еще остается только одна копия объекта.В вашем коде и this.visited, и onetimevisit являются ссылками, указывающими на один и тот же объект в памяти.

С другой стороны, ArrayList имеет нечто, похожее на конструктор копирования.Этот конструктор, который вызывается в моем примере кода выше, создает поверхностную копию заданного ArrayList, что, по-видимому, является тем, что вам нужно.Стоит отметить, что ArrayList не копирует добавленные к нему объекты (он хранит ссылки на них), поэтому, возможно, вам действительно нужно создавать копии этих объектов.Это можно сделать, вызвав их конструкторы копирования (если они позволяют копирование, предоставив такой конструктор), прежде чем вставлять их в ArrayList.

1 голос
/ 23 июля 2011

Если вы хотите new ArrayList(), вам нужно создать его, он не будет делать это автоматически.

...