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();

用法1

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

用法2

clsA.listA=clsB.listB;

用法3

clsA.listA=clsB.listB;
clsB.listB = null;
  1. 这里没问题,真的,您只需复制值即可。
  2. 您复制对 ArrayList 的引用。没关系,只要记住你现在只有一个 ArrayList。 A 和 B 都具有相同的引用。
  3. 您基本上是将 B arraylist 移动到 A,然后将其从 B 中删除。同样没问题。
  • 用法 1:ListA 现在将包含来自 listB 的其他元素。

  • 用法2:ListA现在是ListB,两个引用都指向同一个对象(赋值语句)。如果原始 ListA 没有当前引用,那么它将被垃圾收集。

  • 用法3:ListA现在是ListB(像之前一样引用赋值),紧接着,ListB被赋值给null(指空指针,空指针)。如果原始 ListA 没有当前引用,那么它将被垃圾收集。

I want to put all my values of listB array to listA array, what is the differencies between below usage ?

用法1就是你想要的。

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

另外,考虑一下 ClsA.lstA = (ArrayList) ClsB.lstB.clone();

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