Изменения Node в Java внутри метода

267
21 октября 2017, 16:02

Решил написать простейший метод - опустошить узел.

public static void Node <Integer> n1 (Node <Integer> n1)
{
 while (n1 != null)
    n1 = n1.getNext();
}

Обнаружил что узел не изменился. Перенёс цикл в главный метод - работает.

Вопрос таков: почему узел не изменился внутри метода, узел ведь объект? Почему стеки, очереди, массивы и другие объекты изменяются внутри методов void, а узел нет?

UPD: этот метод который изменяет добавляет в узел цепь в конец узла работает.

public static void what (Node <Integer> n1, int a)
{
while (n1.hasNext())
   n1 = n1.getNext();
Node <Integer> n7 = new Node <Integer> (a);
n1.setNext(n7);
}
Answer 1

Вы не до конца поняли как это работает. В метод передается ссылка на объект, пусть это будет ссылка, которая смотрит на объект n1: A -> n1

Когда вы в своем методе выполняете операцию присваивания n1 = n1.getNext(); ваша ссылка будет смотреть на следующий Node, A -> n1.getNext(), при этом сам Node n1 не изменится, а вы хотите изменить именно его.
Вот вам пример:

public void example(){
    List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3));
    wrongChangeList(list);
    System.out.println(list);
    correctChangeList(list);
    System.out.println(list);
}
private void correctChangeList(List<Integer> list){
    list.clear();
    list.addAll(Arrays.asList(10, 20, 30));
}
private void wrongChangeList(List<Integer> list){
    list = Arrays.asList(10, 20, 30);
}

[1, 2, 3]

[10, 20, 30]

При вызове wrongChangeList ваш внешний список не изменится, изменится лишь ссылка внутри метода wrongChangeList Во втором случае мы изменяем непосредственно объект.

Надеюсь, вы сможете на основе этого понять, как работает ваш второй метод и почему не работает первый.

READ ALSO
Слушатель на динамический узел Firebase

Слушатель на динамический узел Firebase

Идея в следующем: есть узел locations/ns/we и есть узел users/location/ который содержит ключи ns и weПри нажатии на кнопку, координаты и на 1 и на 2 узле изменяются,...

239
Конвертация BBcode в HTML [требует правки]

Конвертация BBcode в HTML [требует правки]

Пользователь должен ввести текст на языке BBCodeЭтот текст отправляется на сервер и возвращается на страницу в виде HTML

299
С# Инверсия байтов при маршалинге в структуру

С# Инверсия байтов при маршалинге в структуру

При попытке маршалинга бинарных данных в структуру происходит инверсия байтов внутри полей структуры те

235