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现在引用同一个对象。 对象不会被复制,也不会在赋值中传递,也不会在参数传递中复制(复制/赋值的是引用)。 等等。
- 可以想象使用“new”关键字创建的任何实例作为指针。 prevRow现在指向currRow做的事情。 Java中唯一的值类型是基元(byte,char,int,long,float,double)。 其他一切都是对象。 原始数组属于Object类别(使用“new”创建)。
- 是(如果你修复了返回类型/ return语句,那么它将编译;))。
prevRow = currRow行是复制列表还是prevRow现在指向与currRow相同的列表? 如果prevRow指向与currRow相同的列表,我应该创建一个新的ArrayList而不是清除..
它现在是对同一列表的引用。 所以清除它会破坏你的prevList。 Insead do currRow = new ArrayList
在类似的问题中,选项1和选项2在上面的代码中做了同样的事情吗?
是的他们这样做。 您正在传递对列表的引用,并进行更改。 所以两者都有效。 选项2更清楚你正在做什么,我更喜欢它的风格,但两者都有效。
请记住,Java始终通过VALUE ..但对于非原始(通常以大写字母开头的任何类),您传递的是内存地址的值,而不是内部内容的值。 对于primative(int,float),您只需传递该值。