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

时间:2018-05-29 04:09:53

标签: java jvm memory-address

链接: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的问题讨论中讨论了上述内容,但我真的想知道我是否考虑过多了?

1 个答案:

答案 0 :(得分:0)

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

  1. 您关心的是

      

    curr.next = new ListNode(carry);

    这个curr可以被java GC回收,这可能导致访问下一次引发异常? =>别担心。 curr仅在addTwoNumbers()执行后(至少)执行。

  2. 所以你的问题

      

    如果在这里向全局ListNode提供临时地址仍然不安全吗?

    =>不,这是安全的。你很简单地构造一个新对象,没关系。

  3. 关于

    的下一个问题
      

    JVM必须经常监视ListNode使用临时地址,导致额外的时间消耗?

    如我所见,你的分配中没有额外的时间消耗。