克隆引用相同对象的多个arraylists

时间:2017-12-06 16:11:24

标签: java performance arraylist clone

我有一个包含某些对象的arraylist a。我还有一个arraylist b包含包含其中一些对象的arraylists。现在,我想克隆arraylist a,同时将arraylist b中的引用更新为克隆对象。伪代码示例:

a = [object1,object2,object3,object4,object5,object6,object7,object8,object9,object10];
b = [[object3,object8,object5],[object2,object9,object1][object6,object7]];

//now, I can clone arraylist a
aClone = [clone1,clone2,clone3,clone4,clone5,clone6,clone7,clone8,clone9,clone10];

//but how do I get a clone of arraylist b containing references to the clones of the objects like so:
bClone = [[clone3,clone8,clone5],[clone2,clone9,clone1][clone6,clone7]];

我想出的是以下内容:

for(int i = 0; i < a.length; i++){
    o = a.get(i);
    aClone.set(i, o);
    for(int j = 0; j < b.length){
        for(int k = 0; k < b.get(j).length){
            if(b.get(j).get(k).value() == o.value())
                bClone.get(j).set(k, o);
        }
    }
}

如果b中存在旧对象,则此代码在创建每个克隆后进行检查,并将其替换为克隆。我想这会非常缓慢,所以有谁知道如何更有效地完成这项工作?

3 个答案:

答案 0 :(得分:1)

只需创建一个这样的类:

class CloneRepository {
    private final Map<Object, Object> cloneMap = new HashMap<Object, Object>();

    public Object getClone(Object source) {
        Object result = cloneMap.get(source);

        if (result == null) {
            result = source.clone();
            cloneMap.put(source, result);
        }  

        return result;
    }
}

然后创建一个新的CloneRepository()。当您克隆每个列表中的条目而不是克隆该对象时,请使用getClone()方法。

答案 1 :(得分:1)

您可以通过在列表中保存包装类来完成此操作,而不是直接引用对象,然后您可以通过调用以下方法来克隆包装对象: myWrapper.cloneObject().

由于b上的列表对包装类具有相同的引用,因此在克隆对象时,将同步2个列表。

答案 2 :(得分:0)

使用数组a,您可以包含一个hashmap - 该对象在数组中的哪个位置。然后当你克隆你的数组a时,你需要找到这个对象的索引(HashMap为O(1)做它)并更改这个引用。它总结为O(N)。