Безопасно ли давать глобальному ListNode временный адрес (назначенный в блоке While)?

Ссылка: https://leetcode.com/problems/add-two-numbers/solution/#

class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0;
while (p != null || q != null) {
    int x = (p != null) ? p.val : 0;
    int y = (q != null) ? q.val : 0;
    int sum = carry + x + y;
    carry = sum / 10;
    curr.next = new ListNode(sum % 10);
    curr = curr.next;
    if (p != null) p = p.next;
    if (q != null) q = q.next;
}
if (carry > 0) {
    curr.next = new ListNode(carry);
}
return dummyHead.next;
}
}

Всем привет, сегодня утром у меня возникла проблема на LeetCode. Решил, но хочу поднять вопрос к официальному решению.

Я знаю, что обращение к переменной, определенной в функции, небезопасно (потому что она будет переработана). Однако, насколько мне известно, те переменные, которые определены в блоках кода, таких как while / for также должны быть переработаны JVM. Хотя JVM не будет его перерабатывать, поскольку на адрес все еще есть указатели, интересно, если все еще небезопасно давать здесь временный адрес глобальному ListNode?

curr.next = new ListNode(carry);

В конце концов, мне интересно, должна ли JVM часто наблюдать за ListNode для использования временного адреса, что приводит к дополнительным затратам времени?

Спасибо! Я также обсуждал вышеизложенное при обсуждении проблемы в Leetcode, но я действительно хочу знать, не слишком ли много я думаю?

Я думаю, вы путаете ряд вещей. C - это не Java, и ссылки не являются объектами, на которые они указывают. Я могу обратиться к одной конкретной вещи: curr.next = new ListNode(carry); безопасен, и JVM не нужно смотреть ListNode чаще, чем любой другой объект, созданный где-либо в вашем Java-коде.

Erwin Bolwidt 29.05.2018 06:26

В Java не существует такого понятия, как «временный адрес». На языковом уровне нет даже такого понятия, как «адрес». Вся суть языкового дизайна в том, что вы не можете делать то, что «небезопасно».

Holger 29.05.2018 14:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу предположить, что вы использовали язык Java (например, вы уже кодировали C) О вашем беспокойстве я могу подвести итог

  1. Ваше беспокойство заключается в том, что

    curr.next = new ListNode(carry);

    что curr может быть переработан java GC, что может вызвать исключение следующего повышения доступа? => Не беспокойтесь об этом. Curr собирается только после выполнения addTwoNumbers () (по крайней мере).

  2. Итак, ваш вопрос

    if it's still not safe to give a temporary address to a global ListNode here?

    => Нет, это безопасно. Вы просто создаете новый объект, это нормально.

  3. Следующее беспокойство о

    the ListNode has to be frequently watched by JVM for using a temporary address, resulting in extra time consumption?

    Как я вижу, в вашем задании нет лишних затрат времени.

Другие вопросы по теме