我主要用C编写,但是我正在使用Java来完成这个项目。我想知道Java在这里做了什么。
ArrayList<Integer> prevRow, currRow;
currRow = new ArrayList<Integer>();
for(i =0; i < numRows; i++){
prevRow = currRow;
currRow.clear();
currRow.addAll(aBunchOfItems);
}
prevRow = currRow行复制列表或prevRow现在指向与currRow相同的列表吗?如果prevRow指向与currRow相同的列表,我应该创建一个新的ArrayList而不是清除....
private ArrayList<Integer> someFunction(ArrayList<Integer> l){
Collections.sort(l);
return l;
}
main(){
ArrayList<Integer> list = new ArrayList<Integer>(Integer(3), Integer(2), Integer(1));
list = someFunction(list); //Option 1
someFunction(list); //Option 2
}
在类似的问题中,选项1和选项2在上面的代码中做了同样的事情吗?
谢谢 -
乔纳森
答案 0 :(得分:8)
如果你从C / C ++来到Java,请记住这个几乎所有这些疑问的黄金法则:在Java中,一个变量(除了原语)总是一个引用(一种指针)到一个对象,从不是对象本身。
例如
prevRow = currRow;
正在分配引用,因此prevRow和currRow现在引用同一个对象。对象不会在赋值中传递,也不会在参数传递中复制(复制/赋值的是引用)。等等。
答案 1 :(得分:1)
答案 2 :(得分:1)
prevRow = currRow行复制 列表或现在指向prevRow 与currRow相同的列表?如果prevRow 我指的是与currRow相同的列表 应该创建一个新的ArrayList 结算..
现在是对同一列表的引用。因此清除它会破坏你的prevList。 Insead做currRow = new ArrayList<Integer>()
在类似的问题中,做选项1和 选项2在中做同样的事情 上面的代码?
是的,他们这样做。您正在将引用传递给列表并进行更改。所以两者都有效。选项2对你正在做的事情更加清楚,我更喜欢它的风格,但两者都有效。
请记住,Java始终通过VALUE ..但对于非原始(任何以大写字母开头的类...),你传递的是内存地址的值,而不是内部的东西的值。对于primative(int,float),您只需传递值。