执行此代码时内存会发生什么变化?
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} ;
}
背后的逻辑是什么?创建一个数组的正确方法是什么?
答案 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" />