Java如何处理ArrayList引用和赋值?

时间:2010-05-06 01:57:18

标签: java arraylist

我主要用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在上面的代码中做了同样的事情吗?

谢谢 -

乔纳森

3 个答案:

答案 0 :(得分:8)

如果你从C / C ++来到Java,请记住这个几乎所有这些疑问的黄金法则:在Java中,一个变量(除了原语)总是一个引用(一种指针)到一个对象,从不是对象本身。

例如

 prevRow = currRow;

正在分配引用,因此prevRow和currRow现在引用同一个对象。对象不会在赋值中传递,也不会在参数传递中复制(复制/赋值的是引用)。等等。

答案 1 :(得分:1)

  1. 将使用“new”关键字创建的任何实例视为指针。 prevRow现在指向currRow做的事情。 Java中唯一的值类型是基元(byte,char,int,long,float,double)。其他一切都是对象。基元数组属于Object类别(使用“new”创建)。
  2. 是(如果你修复了返回类型/ return语句,那么它将编译;))。

答案 2 :(得分:1)

  

prevRow = currRow行复制   列表或现在指向prevRow   与currRow相同的列表?如果prevRow   我指的是与currRow相同的列表   应该创建一个新的ArrayList   结算..

现在是对同一列表的引用。因此清除它会破坏你的prevList。 Insead做currRow = new ArrayList<Integer>()

  

在类似的问题中,做选项1和   选项2在中做同样的事情   上面的代码?

是的,他们这样做。您正在将引用传递给列表并进行更改。所以两者都有效。选项2对你正在做的事情更加清楚,我更喜欢它的风格,但两者都有效。

请记住,Java始终通过VALUE ..但对于非原始(任何以大写字母开头的类...),你传递的是内存地址的值,而不是内部的东西的值。对于primative(int,float),您只需传递值。