【问题标题】:How does Java handle ArrayList refrerences and assignments?Java 如何处理 ArrayList 引用和赋值?
【发布时间】:2011-02-16 04:54:10
【问题描述】:

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

谢谢-

乔纳森

【问题讨论】:

标签: java arraylist


【解决方案1】:

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

例如

 prevRow = currRow;

正在分配一个引用,因此 prevRow 和 currRow 现在引用同一个对象。对象不会被复制,无论是在赋值中,还是在参数传递中(复制/分配的是引用)。以此类推。

【讨论】:

    【解决方案2】:
    1. 将使用“new”关键字创建的任何实例视为指针。 prevRow 现在指向与 currRow 所做的相同的事情。 Java 中唯一的值类型是原语(byte、char、int、long、float、double)。其他一切都是对象。基元数组属于 Object 类别(使用“new”创建)。
    2. 是的(如果您修复了返回类型/返回语句以便编译;))。

    【讨论】:

      【解决方案3】:

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

      它现在是对同一个列表的引用。所以清除它会破坏你的 prevList。 Insead 做currRow = new ArrayList&lt;Integer&gt;()

      在类似的问题中,请执行选项 1 和 选项 2 在 上面的代码?

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

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

      【讨论】:

        猜你喜欢
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多