怎么样快速对HashMap进行深层复制

时间:2022-09-14 22:30:41
在做数据库时用到HashMap模仿一张表,现在需要对内存中的HashMap tablel1进行深层次的复制,产生另外一个完全一样的HashMap table2,前提是table2也许跟table1只相差一点点,一个接一个的子内容进行复制可能很费时,但是里面提供的clone()方法好像只能潜层次的进行复制,各位大侠有没有什么好的建议,在此恭候了!

5 个解决方案

#1


table2也许跟table1只相差一点点?那clone()后再替换掉不同的

#2


clone()不是对于一些引用只能复制引用,不能复制内容吗?

#3


HashMap本身就实现了深克隆的阿,不信你去看看它的代码

#4


我看过了,好像里面的对于(key,value)是直接用e.value = value;赋值的,对于引用来说,应该就没有产生新的对象,而只是用新的指针也指向了它,所以感觉对于纯值clone()来说,是深层复制,但是对于存储引用的来说就不是深层的啦,不知道我的想法对不对。
    private void putForCreate(Object key, Object value) {
        Object k = maskNull(key);
        int hash = hash(k);
        int i = indexFor(hash, table.length);

        /**
         * Look for preexisting entry for key.  This will never happen for
         * clone or deserialize.  It will only happen for construction if the
         * input Map is a sorted map whose ordering is inconsistent w/ equals.
         */
        for (Entry e = table[i]; e != null; e = e.next) {
            if (e.hash == hash && eq(k, e.key)) {
                e.value = value;
                return;
            }
        }

        createEntry(hash, k, value, i);
    }

#5


确实,是我记错了,HashMap这样实现是出于效率和节省内存空间。如果要实现真正的深克隆,只有自己去做循环一个一个的clone了

#1


table2也许跟table1只相差一点点?那clone()后再替换掉不同的

#2


clone()不是对于一些引用只能复制引用,不能复制内容吗?

#3


HashMap本身就实现了深克隆的阿,不信你去看看它的代码

#4


我看过了,好像里面的对于(key,value)是直接用e.value = value;赋值的,对于引用来说,应该就没有产生新的对象,而只是用新的指针也指向了它,所以感觉对于纯值clone()来说,是深层复制,但是对于存储引用的来说就不是深层的啦,不知道我的想法对不对。
    private void putForCreate(Object key, Object value) {
        Object k = maskNull(key);
        int hash = hash(k);
        int i = indexFor(hash, table.length);

        /**
         * Look for preexisting entry for key.  This will never happen for
         * clone or deserialize.  It will only happen for construction if the
         * input Map is a sorted map whose ordering is inconsistent w/ equals.
         */
        for (Entry e = table[i]; e != null; e = e.next) {
            if (e.hash == hash && eq(k, e.key)) {
                e.value = value;
                return;
            }
        }

        createEntry(hash, k, value, i);
    }

#5


确实,是我记错了,HashMap这样实现是出于效率和节省内存空间。如果要实现真正的深克隆,只有自己去做循环一个一个的clone了