Collections.copy问题

jav*_*ect 4 java collections

我想要它b1b2拥有自己的元素集,那么b1和b2应该在内存中有自己的元素,这样当b1/b2被修改时,其他元素不应该受到影响.

buffer是一个ArrayList包含许多元素

List<Integer>  b1 = new ArrayList<Integer>(buffer.size()) ;
List<Integer>  b2 = new ArrayList<Integer>(buffer.size()) ) ;
Collections.copy(b1, buffer);
Collections.copy(b2, buffer);
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

Exception in thread "main"
java.lang.IndexOutOfBoundsException: Source does not fit in dest
    at java.util.Collections.copy(Collections.java:531)
    at Trees.containsSumPrint(Trees.java:243)
    at Trees.main(Trees.java:125)

rat*_*eak 10

ArrayList(int)构造函数给出一个List大小为0 的构造函数,它只确保n在需要重新分配底层数组之前添加元素.

您可以复制列表的更好方法是:

b1.addAll(buffer);
b2.addAll(buffer);
Run Code Online (Sandbox Code Playgroud)

语义与第一次buffer.size()向每个数组添加空值并调用时的语义相同Collections.copy(b1,buffer);


如果您想要深层复制(元素也被复制),您将不得不分别处理每个元素

for(MyObject obj:buffer){
    b1.add(obj.clone());
    b2.add(obj.clone());
}
Run Code Online (Sandbox Code Playgroud)