Java中的赋值运算符 类应用程序{ int[]a; 私有函数(){ int[]b={1,2,3,4}; a=新整数[4]; a=b; } 私有函数(){ 对于(int i=0;i

Java中的赋值运算符 类应用程序{ int[]a; 私有函数(){ int[]b={1,2,3,4}; a=新整数[4]; a=b; } 私有函数(){ 对于(int i=0;i,java,arrays,pointers,memory-management,Java,Arrays,Pointers,Memory Management,垃圾收集,根据定义,只释放不再被引用的内存。在这种情况下,显然,a仍在引用数组。两者都不是。Java的垃圾收集是基于可访问性的——某个对象链是否可以从某个已知起点访问该对象。更多信息 因此,当b超出范围时,由于仍然可以通过a访问阵列,因此阵列不会被解除分配 Java中没有使用引用计数,尽管至少在这种情况下,我认为它将与Java的GC具有相同的效果。Jon Skeet在回答中谈到了这个问题,并说它没有被使用,因为它会对性能产生不利影响,并且在对象图中循环失败。Brad Abrams的帖子对此进行了

垃圾收集,根据定义,只释放不再被引用的内存。在这种情况下,显然,a仍在引用数组。

两者都不是。Java的垃圾收集是基于可访问性的——某个对象链是否可以从某个已知起点访问该对象。更多信息

因此,当
b
超出范围时,由于仍然可以通过
a
访问阵列,因此阵列不会被解除分配


Java中没有使用引用计数,尽管至少在这种情况下,我认为它将与Java的GC具有相同的效果。Jon Skeet在回答中谈到了这个问题,并说它没有被使用,因为它会对性能产生不利影响,并且在对象图中循环失败。Brad Abrams的帖子对此进行了扩展。

+1,不知道为什么有人ne否决了这个问题,我觉得很好。
class App{   
    int[] a;

    private void firstFunction(){
        int[] b = {1, 2, 3, 4};
        a = new int[4];
        a = b;
    }

    private void secondFunction(){
        for(int i=0; i<a.length; a++) System.out.println(a[i]);
    }
}