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:更新的答案