почему неглубокая копия на Hashmap не отражает - PullRequest
0 голосов
/ 06 мая 2020

Я создал карту, добавил несколько элементов и клонировал, чтобы продемонстрировать мелкую копию. после клонирования я добавил новый элемент в старую ссылку, но элемент не был отражен в новой ссылке.

public class Test implements Cloneable {

    public static void main(String[] args) {
        HashMap<String,String> smap  = new HashMap<String,String>();
        smap.put("a1","a1");
        smap.put("a2","a2");
        smap.put("a3","a3");
        smap.put("a4","a4");

        //SHALLOW COPY 
        HashMap<String,String> cMap = (HashMap)smap.clone();
        cMap.put("b1","bb");


        smap.put("a5","55");

        System.out.println("orignal_map\t"+smap);
        System.out.println("cMap\t"+cMap);

        HashMap<String, String> scopyx = new HashMap<String, String>(smap);
        System.out.println("S_copy_x:\t"+scopyx);

    }
}

1 Ответ

0 голосов
/ 06 мая 2020

Мелкое копирование означает, что оно не применяется к копированию объектов внутри исходных объектов. То есть, если у вас есть объект, содержащий коллекцию, и вы клонируете этот объект, сама коллекция не копируется и может использоваться несколькими экземплярами:

public class Test implements Cloneable {
    private List<String> innerList = new ArrayList<>();

    public void addBaz(String baz) {
        innerList.add(baz);
    }

    public List<String> getInnerList() {
        return innerList;
    }

    public void setInnerList(List<String> innerList) {
        this.innerList = innerList;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Test bar1 = new Test();
        bar1.addBaz("baz1");
        bar1.addBaz("baz2");
        bar1.addBaz("baz3");

        System.out.println("bar1 before cloning: " + bar1.getInnerList());

        Test cloneBar = (Test) bar1.clone();

        System.out.println("clone: " + cloneBar.getInnerList());

        bar1.addBaz("baz4");
        System.out.println("clone after adding to original: " + cloneBar.getInnerList());

        cloneBar.addBaz("cloneBaz1");
        System.out.println("bar1 after adding to clone: " + bar1.getInnerList());
    }
}

Результат:

bar1 before cloning: [baz1, baz2, baz3]
clone: [baz1, baz2, baz3]
clone after adding to original: [baz1, baz2, baz3, baz4]
bar1 after adding to clone: [baz1, baz2, baz3, baz4, cloneBaz1]
1006 *

Результат:

map before cloning: {a1=->a1, a2=->a2, a3=->a3}
clone: {a1=->a1, a2=->a2, a3=->a3}
clone after adding to original: {a1=->a1, a2=->a2, a3=->a3}
original after adding to clone: {a1=->a1, a2=->a2, a3=->a3, b1=->b1}
clone after modifying object inside original: {a1=->new a1, a2=->a2, a3=->a3, c1=->c1}
original after modifying the clone: {a1=->new a1, a2=->cloned a2, a3=->a3, b1=->b1}
...