给全局 ListNode 一个临时地址(在 While 块中分配)是否安全?

Is it safe to give a temporary address ( assigned in a While block ) to a global ListNode?

Link: 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);

毕竟我想知道ListNode是不是因为使用了临时地址,需要经常被JVM监视,导致额外的时间消耗?

谢谢!我在Leetcode的问题讨论中也讨论了以上内容,但我真的很想知道我是否考虑太多?

我可以假设您已经使用过 Java 语言(就像您已经编写了 C 语言一样) 关于你的顾虑,我可以总结一下

  1. 您担心的是

    curr.next = new ListNode(carry);

    curr 可以被 java GC 回收,这可能会导致 access next 引发异常? => 别担心。 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?

    据我所知,您的作业没有额外的时间消耗。