Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中如何在一行中返回数组?_Java_Memory Management - Fatal编程技术网

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

在Java中如何在一行中返回数组?,java,memory-management,Java,Memory Management,执行此代码时,内存会发生什么变化 int[] dim1 = new int[2]; dim1 = myObject.getCoord(); public int[] getCoord() { int[] dim2 = new int[] {y1, x1} ; return dim2; } 似乎空间首先分配给两个数组dim1和dim2。虽然dim1将存活,但dim2仅存活两行,然后进入gc。对于非常大的阵列,这似乎会导致一些性能问题。然而,下面的代码是编译时错误 public i

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

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

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

似乎空间首先分配给两个数组
dim1
dim2
。虽然dim1将存活,但dim2仅存活两行,然后进入gc。对于非常大的阵列,这似乎会导致一些性能问题。然而,下面的代码是编译时错误

public int[] getCoord() {
    return {y1, x1} ;
}
背后的逻辑是什么?仅创建一个数组的正确方法是什么

你是说像这样吗

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} ;
}

这表明该方法正在“创建”一个对象。

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

int[] dim1 = new int[0];
为了节省内存

对于单班轮,只需执行以下操作:

int[] dim1 = myObject.getCoord();
然后在您的方法中使用:

return new int[] { y1, x1 };

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

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

试图使代码更简洁不会帮助您解决性能问题


只是不要将
dim1
初始化为
newint[2]在开头,因为不管怎样,它会被替换掉。但这只是小问题。

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

int[] dim = myObject.getCoord();


“虽然dim1将存活,但dim2仅存活两行,然后进入gc。”这不是真的。这取决于您如何处理返回的数组。如果结果(也就是方法中新数组的引用地址)存储在某个引用中(就像您在示例中所做的那样),它将不会被垃圾收集。嗯,dim1的初始值只存在一行,然后立即被调用getCoord的结果所替换。“dim2”(现在分配给dim1)引用的寿命与s dim1被某个对象引用的时间一样长。要清楚,您的第一个选项为零元素数组分配内存:数组本身不占用任何内存,但引用占用内存,这需要进行垃圾收集。
get…
创建对象的方法对于可变对象类型的所有属性来说都是非常标准的。如果它们返回对内部可变状态的引用,那将是相当令人惊讶的。除此之外,对象的创建与程序的逻辑无关,那么为什么要在方法名中强调它呢;p1.x=100;点p2=x.getCoord()
p2.x==p1.x
,如果您执行上述操作,这肯定不是真的。如果该方法被称为createCoord,那么您会更好地理解,以后调用它不会给您相同的对象。您所描述的,就是我所描述的“返回对内部可变状态的引用”,这不是规范。查看所有返回可变对象的JRE getter方法。除非另有明确说明,否则它们都返回一个新对象。正如我所说,能够通过
object.getCoord().x=newValue实际更改属性ImmutableArray getCoord()
当然,但每次调用它时都返回一个新数组,因此我的建议
get
不是很有描述性,在这种特定情况下,显然您误解了。例如,请参见AWT
Component.get前台()
Component.getFont()
Component.getName()
。由于
Color
Font
String
是不可变的,因此会返回直接引用。相反,
Component.getLocation()
Component.getSize()
Component.getBounds()
返回副本,因为
维度
矩形
是可变的。一般的设计模式是,您无法通过
get…
方法返回的对象修改属性。任何人都不应该对此感到惊讶;这是自Java1.1以来的工作方式。
int[] coord = new int[2];
myObject.setCoord(coord);

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