Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与赋值混淆_Java - Fatal编程技术网

Java 与赋值混淆

Java 与赋值混淆,java,Java,以下两者之间是否存在差异: ArrayList list = getData(); public ArrayList getData(){ return otherList; } 及 没有区别。在这两种情况下,您都是将对现有阵列列表的引用指定给列表,没有区别。在这两种情况下,您都是将对现有阵列列表的引用指定给列表否。列表只是对内存中对象的引用。 这意味着如果您这样做: list1 = list2; list1.add("abc"); list2.get(list2.size()-1

以下两者之间是否存在差异:

ArrayList list = getData();

public ArrayList getData(){
    return otherList;
}


没有区别。在这两种情况下,您都是将对现有
阵列列表的引用指定给
列表
,没有区别。在这两种情况下,您都是将对现有
阵列列表的引用指定给
列表
否。列表只是对内存中对象的引用。 这意味着如果您这样做:

list1 = list2;
list1.add("abc");
list2.get(list2.size()-1)
也将是“abc”


在方法中,返回相同的引用,因此其行为相同。如果在方法中返回列表的复制,则两种方法不同。

否。列表只是引用内存中的对象。 这意味着如果您这样做:

list1 = list2;
list1.add("abc");
list2.get(list2.size()-1)
也将是“abc”

在方法中,返回相同的引用,因此其行为相同。如果您在方法中返回列表的copy,则有两种方法不同。

这很奇怪:

ArrayList list = getData();

public ArrayList getData(){
    return list;
}
您正在将列表设置为它自己的值,即最初的
null

因此,如果
someotherlist
不为空,则有一个区别,因为您1什么也不做

编辑:看到您的编辑。现在两个赋值都是相同的。没有区别。我们可以说,调用函数时,其中一个可能会稍微慢一点,但在这种情况下,JIT编译器会快速内联它。

这很奇怪:

ArrayList list = getData();

public ArrayList getData(){
    return list;
}
ArrayList list = someOtherArrayList;
您正在将列表设置为它自己的值,即最初的
null

因此,如果
someotherlist
不为空,则有一个区别,因为您1什么也不做

编辑:看到您的编辑。现在两个赋值都是相同的。没有区别。我们可以说,调用函数时,其中一个可能会稍微慢一点,但在这种情况下,JIT编译器将快速内联该函数

ArrayList list = someOtherArrayList;
在这种情况下,直接将someOtherArrayList的地址分配给list

ArrayList list = getData();

public ArrayList getData() {   
    return otherList;
}
在这种情况下,返回的列表地址被复制到临时变量中,然后再将临时变量复制到列表中。此处地址复制到临时变量中,因为:当函数返回时,堆栈上的所有数据都被释放/删除,所以otherList对象引用也被删除。但在此之前,引用/地址被复制到临时变量中。将临时变量中的地址复制到列表变量中时。它也被删除

在这种情况下,直接将someOtherArrayList的地址分配给list

ArrayList list = getData();

public ArrayList getData() {   
    return otherList;
}

在这种情况下,返回的列表地址被复制到临时变量中,然后再将临时变量复制到列表中。此处地址复制到临时变量中,因为:当函数返回时,堆栈上的所有数据都被释放/删除,所以otherList对象引用也被删除。但在此之前,引用/地址被复制到临时变量中。将临时变量中的地址复制到列表变量中时。它也被删除。

编辑代码以使其更清晰。更改其中一个的名称。:)编辑我的答案以反映您对问题的编辑。编辑代码以使其更清晰。更改其中一个的名称。:)编辑我的答案以反映您对问题的编辑。您认为为什么退出时会取消
otherList
?它不是该方法内部的局部变量。它似乎是类的成员字段。是。它是类的成员字段。@GrahamBorland:如果在本地创建并返回列表,则对象引用将被删除。但如果它是类字段,则返回它的引用,但与上面解释的相同。@GrahamBorland:更新的回答为什么您认为退出时会释放
otherList
?它不是该方法内部的局部变量。它似乎是类的成员字段。是。它是类的成员字段。@GrahamBorland:如果在本地创建并返回列表,则对象引用将被删除。但若它是类字段,那个么它的引用将返回,但与上面解释的相同。@GrahamBorland:更新的答案