有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

内存管理在Java中如何在一行中返回数组?

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

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) 个答案

  1. # 1 楼答案

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

    int[] dim1 = new int[0];
    

    为了节省内存

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

    int[] dim1 = myObject.getCoord();
    

    然后在你的方法中使用:

    return new int[] { y1, x1 };
    

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

  2. # 2 楼答案

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

    int[] dim = myObject.getCoord();
    

    或者

    int[] coord = new int[2];
    myObject.setCoord(coord);
    
    public void setCoord(int[] coord) {
        coord[0] = x;
        coord[1] = y;
    }
    
  3. # 3 楼答案

    你是说像这样吗

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

    这就明确了这个方法是在“创造”一个东西

  4. # 4 楼答案

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

    试图让代码更简洁并不能解决性能问题

    如果你想的话,不要一开始就把dim1初始化为new int[2];,因为不管怎样,它都会被替换掉。但这是小土豆