2014-01-26 29 views
3

我有一个类MyClass与会员float[] myArray。我建立基于以下几点:Java当我将一个数组参数赋值给构造函数中的成员时会发生什么?

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设置为空,我希望GC照顾它并将该RAM还给我)。

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

回答

4

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

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

最好做以下事情吗?
- >优选 - 没有。这取决于你需要什么,
在这里你创建一个实际的副本,都是好的。
设置那里initArray = null;是没用的btw
as initArray没有通过引用传入。在Java
一切是按值传递,甚至引用
initArray这里是一个参考)

在第一种方法,如果initArray是在其他一些功能创造了
局部变量会发生什么?

- >把它看成是你保存在你的MyClass的对象,局部变量
的参考,当你的函数完成
执行(我想这是你的关心),你不会失去它。简单地说,只要您的MyClass对象(您保存它)存在,它就会生存

4

JVM设置指针是否相同?

是。

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

只要你不使用方法调用后initArray参考修改您的阵列,也没有理由让你的数组的一个副本。

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

这就好。只要至少有一个变量指向你的数组(在这种情况下,你有你的myArray),它将不符合垃圾回收的条件。

0

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

相关问题