0

构造函数将一个List作为参数,这个List需要填充相同的元素,例如“1”并克隆7次,将结果分配给不同的集合,这样7个方法就会处理它们的每个列表。

构造函数调用:

public Class1 {
    public Class2 arrayList = new Class2(new ArrayList<>(10000))
    public Class2 linkedList = new Class2(new LinkedList<>())
    public Class2 cowList = new Class2(new CopyOnWriteArrayList<>())
}

public Class2 {

    private List<Integer> list;
    private List<Integer> list2;
    private List<Integer> list3;
    private List<Integer> list4;
    private List<Integer> list5;
    private List<Integer> list6;
    private List<Integer> list7;

    public Class2(List<Integer> list) {

        for (int i = 0; i < list.size(); i++) {
            list.add(1);
        }

        this.list = list;
        this.list2 = list;
        this.list3 = list;
        this.list4 = list;
        this.list5 = list;
        this.list6 = list;
        this.list7 = list;
    }

    method1(){
        // list - doSomething...;
    }

    method2(){
        // list1 - doSomething...;
    }

    method3(){
        // list2 - doSomething...;
    }    

    method4(){
        // list3 - doSomething...;
    }

    ...

}

每个方法对其列表执行特定操作。根据被调用的构造函数,列表是-ArrayListLinkedListCopyOnWriteArrayList

我的代码不起作用。我究竟做错了什么?

4

1 回答 1

0

使用以下语句,您的所有列表都指向相同的内存位置,因此列表上的任何操作都对所有 list1 到 list7 可见。

this.list = list; this.list2 = list; this.list3 = list;

相反,您需要使用接受 aCollection作为参数的适当列表构造函数生成一个包含输入列表元素的新数组列表。

由于输入可以是任何List类型,您可以使用instanceof来检查输入的类型并调用适当的构造函数。

注意:您只是在创建一个新列表。因此,对原始列表的更改不会反映在这七个列表中。但是列表中包含的对象仍然在新列表中引用,因为我们没有克隆对象。我们只是创建一个具有相同对象的新列表。因此,如果您使用List<SomeObject>而不是List<Integer>, SomeObjectare 是可变的,那么对对象的任何操作都会反映在每个列表上。这不适用于此特定问题,因为它使用不可变Integer对象。

private static List<Integer> copy(List<Integer> input) {
    if(input instanceof ArrayList) {
        return new ArrayList<>(input);
    } else if (input instanceof LinkedList) {
        return new LinkedList<>(input);
    }
    // others
    ...............
    ...............

}

现在在你的类的构造函数中调用这个方法。

this.list = copy(list);
this.list2 = copy(list);
this.list3 = copy(list);

您还可以将开头的 for 循环替换为以下内容:

Collections.fill(list, 1);

但是使用当前代码,所有输入都是空的,因此size您传递的每个列表的0. 因此不会发生元素填充(使用for循环或Collections.fill

new ArrayList<>(10000)不更新数组列表的大小。它只初始化后备数组。

也读这个

于 2021-11-01T06:13:48.430 回答