繁体   English   中英

Java参考和垃圾收集器

[英]Java reference and garbage collector

我下面有两节课,我想学习两种类型的作业之间的区别是什么

类别:

 class ClassA {
        public ArrayList<String> listA;
        public ClassA() {}
    }

    class ClassB {
        public ArrayList<String> listB;
        public ClassB() {}
    }

我想将所有的listB数组值放入listA数组,以下用法之间有什么区别? 第二次使用时,两个类之间是否存在任何引用,这对于垃圾收集器删除对象可能是个问题。 那usage3呢?

ClassA clsA= new ClassA();
ClassB clsB= new ClassB();

usage1

for (String s : clsB.listB) {
    clsA.listA.add(s);
}

usage2

clsA.listA=clsB.listB;

usage3

clsA.listA=clsB.listB;
clsB.listB = null;
  1. 没问题,实际上,您只需复制值即可。
  2. 您将引用复制到ArrayList。 没关系,请记住,您现在只有一个ArrayList。 A和B都有相同的参考。
  3. 基本上,您将B数组列表移到A,然后将其从B中删除。再次没有问题。
  • 用法1:ListA现在将具有其他元素,这些元素来自listB。

  • 用法2:ListA现在是ListB,两个引用都引用同一个对象(赋值语句)。 如果原始ListA没有当前引用,则将对其进行垃圾回收。

  • 用法3:ListA现在是ListB(与之前一样的引用赋值),然后紧随其后,ListB被赋值为null(指的是空指针)。 如果原始ListA没有当前引用,则将对其进行垃圾回收。

我想将所有的listB数组值放入listA数组,以下用法之间有什么区别?

用法1是您想要的。

如上所述,选项1不是“分配”。 在ClsA.lstB.clear()之前进行复制。

此外,考虑ClsA.lstA =(ArrayList)ClsB.lstB.clone();

这将提供目标的干净(浅)副本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM