Java在构造函数中为成员分配数组参数时会发生什么?

时间:2014-01-26 20:42:34

标签: java arrays memory-management

我有一个成员MyClass的班级float[] myArray。我使用以下内容构建:

public MyClass(float[] initArray) {
    myArray = initArray;
}

我想知道幕后发生了什么:JVM是否设置指针相同?我是否有丢失myArray变量到垃圾收集器的风险?

最好是执行以下操作:

public MyClass(float[] initArray) {
    int len = initArray.length;
    myArray = new float[len];
    System.arraycopy(initArray, 0, myArray, 0, len);
    initArray = null;
}

我问,因为我在内存紧张的嵌入式环境中编程,我不想丢失变量(例如第一个示例)或浪费额外空间(例如,通过将initArray设置为null,我希望GC能够处理它并让我回到RAM中。

  • 编辑 - 在第一种方法中,如果initArray是在其他函数中创建的局部变量会发生什么? 感谢。

3 个答案:

答案 0 :(得分:4)

  

JVM是否设置指针相同?

  

我是否有将myArray变量丢失到垃圾收集器的风险?

没有

只要在方法调用后不使用initArray引用修改数组,就没有理由复制数组。

  

如果initArray是在其他函数中创建的局部变量,会发生什么?

这很好。只要至少有一个变量指向您的数组(在这种情况下,您拥有myArray),它就没有资格进行垃圾回收。

答案 1 :(得分:4)

JVM是否设置指针相同?
- >是的,在Java中,它们更好地称为引用。

我是否有将myArray变量丢失到垃圾收集器的风险?
- >不,除非您丢失对MyClass对象的引用。

最好是这样做吗?
- >优先 - 没有。这取决于你需要什么,
在这里你创建一个实际的副本,两者都可以。
在那里设置initArray = null;是没用的btw
因为initArray未通过引用传递。在爪哇 一切都是通过价值传递的,甚至是参考文献 (initArray是此处的参考)

在第一种方法中,如果initArray是一个会发生什么 在其他一些函数中创建的局部变量?
- >当你保存对该局部变量的引用时,可以想一想 在你的MyClass对象中,当你的函数完成时你不会丢失它 执行(我想这是你的关注)。简单地说,它会活着 只要你的MyClass对象(你保存它)就存在。

答案 2 :(得分:0)

指针确实指向同一个数组,只要它指向数组,它就不会被视为垃圾。