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

Java如何处理ArrayList引用和赋值?,java,arraylist,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); } 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);
}
ArrayList prevRow,currRow;
currRow=newarraylist();
对于(i=0;i
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
}
private ArrayList someFunction(ArrayList l){
集合。排序(l);
返回l;
}
main(){
ArrayList=新的ArrayList(整数(3)、整数(2)、整数(1));
list=someFunction(list);//选项1
someFunction(list);//选项2
}
在一个类似的问题中,选项1和选项2在上述代码中是否做了相同的事情

谢谢-

乔纳森

  • 将任何使用“new”关键字创建的实例视为指针。prevRow现在指向currRow所做的相同事情。Java中唯一的值类型是原语(byte、char、int、long、float、double)。其他一切都是一个对象。基本体数组属于对象类别(使用“新建”创建)
  • 是(如果您修复了return类型/return语句,使其能够编译;)
    如果您是从C/C++来到Java,请记住这条黄金法则,它将回答几乎所有这些疑问:在Java中,变量(原语除外)始终是指向对象的引用,而不是对象本身

    比如说

     prevRow = currRow;
    
    正在指定引用,以便prevRow和currRow现在引用同一对象。对象既不在赋值中也不在参数传递中复制(复制/赋值的是引用)。等等

    prevRow=currRow行是否正在复制 prevRow现在指向的是列表还是 与currRow相同的列表?如果前一行 指向与currRow、I相同的列表 应改为创建新的ArrayList 清理

    它现在是对同一列表的引用。因此,清除它将核化您的列表。Insead do
    currRow=new ArrayList()

    在类似的问题中,执行选项1和 选项2在同一时间做同样的事情 以上代码

    是的。您正在传递对列表的引用,并对其进行更改。所以两者都起作用。选项2更清楚地说明了您正在做什么,我更喜欢它的风格,但两者都有效


    记住,Java总是按值传递。。但对于非原语类(通常以大写字母开头的任何类…),传递的是内存地址的值,而不是内存中内容的值。对于primative(int,float),则只需传递值。

    问题的基础与数组列表无关。您应该了解Java中如何处理引用