许多Java集合实现了add方法 - 它们实际上是深层复制的

Bol*_*Bol 0 java collections methods naming-conventions

我只是抓住集合,发现add()方法实际上将对象深度复制到集合中.它们应该被称为"copyInto"吗?

import java.util.*;
class Test {
    public static void main(String[] args) {

        Set <Frog> setOfFrogs = new HashSet <Frog>();

        Frog frog1 = new Frog("Kermit");
        Frog frog2 = new Frog("Bob");

        setOfFrogs.add(frog1);
        setOfFrogs.add(frog2);

        frog1.name = "May";
        frog2.name = "Mary";

        for (Frog eachFrog : setOfFrogs){
            System.out.println(eachFrog.name);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印:"May"和"Mary".

对不起,这是一个浅色的副本.我需要将这个"参考"业务纳入我的厚脸皮......

Boz*_*zho 9

.add(..)只需添加对集合中对象的引用.它没有深度复制.例如,如果更改对象,则更改将反映在集合中.

  • 更清楚(IMO)说它将*引用*添加到集合中.然后你有两个对同一个对象的引用(一个在调用代码中,一个在集合中).这清楚地说明它除了引用之外没有复制任何东西. (2认同)
  • 因此添加了参考文献的副本.深拷贝在哪里? (2认同)