如何在Java中以一行返回数组?

时间:2016-05-27 20:56:13

标签: java memory-management

执行此代码时内存会发生什么变化?

int[] dim1 = new int[2];
dim1 = myObject.getCoord();

public int[] getCoord() {
   int[] dim2 = new int[] {y1, x1} ;
    return dim2;
}

似乎首先为两个数组dim1dim2分配了空间。虽然dim1将会存在,但dim2仅存在两行,然后转到gc。它似乎会导致一些真正大型数组的性能问题。但是,下面的代码是编译时错误。

public int[] getCoord() {
    return {y1, x1} ;
}

背后的逻辑是什么?创建一个数组的正确方法是什么?

4 个答案:

答案 0 :(得分:5)

你是说这个意思吗?

int[] dim1 = myObject.getCoord();

public int[] getCoord() {
    return new int[] {y1, x1} ;
}

通过方法调用只创建了一个数组,并且只有一个引用dim1。

但是理想情况下你可能不希望“get”方法创建新东西,就像查看你可能没想到的声明一样。就个人而言,我更喜欢

int[] dim1 = myObject.createCoord();

public int[] createCoord() {
    return new int[] {y1, x1} ;
}

明确表示该方法正在“创造”一件事。

答案 1 :(得分:0)

当您重新分配dim1时,它会忘记它存储的先前值。它实际上是dim1的初始(空)值,它正在收集垃圾。你可以很容易地做到:

int[] dim1 = new int[0];

为了节省记忆。

对于单行,只需:

int[] dim1 = myObject.getCoord();

然后在你的方法中使用:

return new int[] { y1, x1 };

然而,这将消耗与我的第一个选项完全相同的内存量。

答案 2 :(得分:0)

无论您如何尝试缩短代码,它都不会改变这样一个事实:当getCoord()的调用返回时,它只返回 引用 < / strong>到数组,而不是数组内容的 副本

尝试使代码更简洁无法帮助您解决性能问题。

如果您愿意,请不要在开始时将dim1初始化为new int[2];,因为无论如何都会立即替换它。但那是小土豆。

答案 3 :(得分:0)

有两种方法可以确保只创建一个数组。

int[] coord = new int[2];
myObject.setCoord(coord);

public void setCoord(int[] coord) {
    coord[0] = x;
    coord[1] = y;
}

或者

<div id="number" />