克隆java ArrayList并防止其被修改

克隆java ArrayList并防止其被修改,java,arraylist,Java,Arraylist,我有一个类似于数据库行集的数据结构,它有行,行有列。我需要用空值初始化一个列,当前代码是循环遍历一行的每一列,并将值初始化为空。如果您有100行或10列,这是非常低效的 因此,我将保留行集级别的列的初始化ArrayList,然后对单个行执行此ArrayList的克隆,因为我相信克隆()比循环遍历每个元素更快 row.columnsValues=rowsset.NullArrayList.clone() 这方面的问题是NullArrayList在被克隆后可能会被意外修改,从而牺牲了ArrayLis

我有一个类似于数据库行集的数据结构,它有行,行有列。我需要用空值初始化一个列,当前代码是循环遍历一行的每一列,并将值初始化为空。如果您有100行或10列,这是非常低效的

因此,我将保留行集级别的列的初始化ArrayList,然后对单个行执行此ArrayList的克隆,因为我相信克隆()比循环遍历每个元素更快

row.columnsValues=rowsset.NullArrayList.clone()

这方面的问题是NullArrayList在被克隆后可能会被意外修改,从而牺牲了ArrayList在行集级别的完整性,以防止我做3件事

1) DelayList作为最终版本 2) 我插入的任何元素都是final或null 3) 通过此arrayList传递给其他数组的方法被声明为final

听起来像是一个计划,你看到洞了吗?

你可以用

返回指定列表的不可修改视图。此方法允许模块向用户提供对内部列表的“只读”访问


您仍然可以向数组中添加新元素

为什么不直接使用:


row.columnsValues=Collections.unmodifiableList((ArrayList)rowsset.NullArrayList.clone())

这是一个实例保持公共ArrayList的类,该列表是共享的,但不能在此类之外更改。当返回浅层副本时,此列表中的元素也需要保护自己

public class ArrayListUnmodifiability {


private ArrayList myList;
public ArrayListUnmodifiability() {

    myList = new ArrayList(2);      
    MyObj obj = new MyObj("Cannot be changed");
    obj.setValue(1);
    myList.add(0, obj);
    myList.add(1, null);        
}


public ArrayList getList() {
    return  (ArrayList) myList.clone();
}


}

public class MyObj {

public MyObj(String name) {
    this.name = name; 
}

public String getName() {
    return name;
}

private final String name;

}

这不好。通过向原始列表中添加一些内容,您仍然可以向不可修改列表中添加一些内容。clone()方法返回一个对象,因此rowsset.NullArrayList.clone()应强制转换为ArrayList=Collection.unmodifiableList(rowsset.NullArrayList.clone())我需要按照以下方式修改myList元素myList.set(I,new Object()); 但是,我想防止,当返回对象作为clone()的结果是原始对象之一时,myList.get(I).setXYZ()。我认为解决这个问题的方法是,当我创建原始的NullArrayList时,我需要存储定义为“final”final Object obj=new Object()的对象;添加(i,obj)@user222164:这意味着你不希望你的列表不可修改,但是列表中的实际对象是不可修改的,这是另一个问题,尽管很容易解决。谢谢大家。我想保护原始列表及其内容,它在我的头脑中变得清晰。我将发布解决方案。