Ссылка: 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, но я действительно хочу знать, не слишком ли много я думаю?
В Java не существует такого понятия, как «временный адрес». На языковом уровне нет даже такого понятия, как «адрес». Вся суть языкового дизайна в том, что вы не можете делать то, что «небезопасно».




Я могу предположить, что вы использовали язык Java (например, вы уже кодировали C) О вашем беспокойстве я могу подвести итог
Ваше беспокойство заключается в том, что
curr.next = new ListNode(carry);
что curr может быть переработан java GC, что может вызвать исключение следующего повышения доступа? => Не беспокойтесь об этом. Curr собирается только после выполнения addTwoNumbers () (по крайней мере).
Итак, ваш вопрос
if it's still not safe to give a temporary address to a global ListNode here?
=> Нет, это безопасно. Вы просто создаете новый объект, это нормально.
Следующее беспокойство о
the ListNode has to be frequently watched by JVM for using a temporary address, resulting in extra time consumption?
Как я вижу, в вашем задании нет лишних затрат времени.
Я думаю, вы путаете ряд вещей. C - это не Java, и ссылки не являются объектами, на которые они указывают. Я могу обратиться к одной конкретной вещи:
curr.next = new ListNode(carry);безопасен, и JVM не нужно смотреть ListNode чаще, чем любой другой объект, созданный где-либо в вашем Java-коде.