Java如何处理ArrayList的refrerences和赋值?

我主要用C语言编写,但我在这个项目中使用Java。 我想知道Java在这里做了什么。

ArrayList prevRow, currRow; currRow = new ArrayList(); for(i =0; i < numRows; i++){ prevRow = currRow; currRow.clear(); currRow.addAll(aBunchOfItems); } 

prevRow = currRow行是复制列表还是prevRow现在指向与currRow相同的列表? 如果prevRow指向与currRow相同的列表,我应该创建一个新的ArrayList而不是清除….

 private ArrayList someFunction(ArrayList l){ Collections.sort(l); return l; } main(){ ArrayList list = new ArrayList(Integer(3), Integer(2), Integer(1)); list = someFunction(list); //Option 1 someFunction(list); //Option 2 } 

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

谢谢-

乔纳森

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

例如

  prevRow = currRow; 

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

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

prevRow = currRow行是复制列表还是prevRow现在指向与currRow相同的列表? 如果prevRow指向与currRow相同的列表,我应该创建一个新的ArrayList而不是清除..

它现在是对同一列表的引用。 所以清除它会破坏你的prevList。 Insead do currRow = new ArrayList()

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

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

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