gpt4 book ai didi

java - Java中局部变量的生命周期

转载 作者:行者123 更新时间:2023-11-30 03:18:33 26 4
gpt4 key购买 nike

     public List<Map<String,class1>> methodName(String Parameter)
{
//create instance of List
List<Map<Strig,class1>> list1 = new ArrayList<Map<String,class1>>();

for(ArrayList arrayList : someGlobalList)
{
//create instance of class1
//Initialize class1 with values in arrayList
//Put this class1 as a value to tempMap which is created inside this loop
//Put that tempMap into List
}
return list1;
}

我的疑问

我了解我们无法保证垃圾收集。但是this question表示当我们返回本地引用时不会被垃圾收集。就我而言,class1 是一个本地对象。但我正在返回list1。将调用者函数中的这些对象用作 list1.get("key") 是否安全。它将返回class1对象。我可以安全地使用类(class)成员吗?

最佳答案

只有在您的代码无法再访问对象的最后一个引用后,该对象才有资格进行垃圾回收。

让我们计算一下对新创建的对象的引用。目前,每个 class1 对象仅从列表中引用,因此让我们看看对列表本身的引用。

您有一个名为 list1 的引用。

然后你返回一个值。这将创建一个第二引用,该引用被放置在堆栈中并传递给调用者。

List<...> result = theObj.methodName("foo");

在此过程中,第一个引用 (list1) 不再可访问,但返回的引用仍然可访问 - 它将被分配给变量 result在这种情况下。因此,您仍然拥有一份有效且可访问的列表引用。因此,列表中的每个引用也是有效且可访问的。

所以是的,使用起来完全安全。

除了 Java 之外,还有其他语言可以在堆栈空间中分配对象。也就是说,对象本身是在本地分配的。返回对此类对象的引用是不安全的,因为堆栈帧会被弹出。以 C 语言为例,它返回一个指向本地数组开头的指针:

char *bad_string(void)
{
/* BAD BAD BAD */
char buffer[] = "local string";
return buffer;
}

但在 Java 中,对象总是分配在堆空间中(除非内部优化对程序员不可见,并且被检查为安全,如注释中所述)。

new 运算符分配的对象永远不会“弹出”,并且始终遵守垃圾收集规则。堆栈/本地方法空间仅用于基元和引用,并且您永远不会获得对其中任何一个的引用,而只能获得对对象的引用。因此,如果您引用了某些内容,您可以相信它的内存是安全的。

关于java - Java中局部变量的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31918797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com