美文网首页
[Java错误]Collections的copy方法拷贝Arra

[Java错误]Collections的copy方法拷贝Arra

作者: Dale_Dawson | 来源:发表于2019-02-23 16:24 被阅读0次

    昨天在安卓应用中发现了一个bug,找了很久才发现原因,页面A将一个list传给页面B,页面B直接使用了这个list引用,快键键可以直接进去B页面,快捷键进入B页面就报错了,最后发现是我在页面A中将list clear掉了,索性想复制一个list保存用于转给下一个页面。

List<Person> srcList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            srcList.add(new Person("dale dawson", i));
        }
        List<Person> desList=new ArrayList(srcList.size());
        Collections.copy(desList, srcList);

代码基本就是这样的,然而结果是



报了一个常见的IndexOutOfBoundsException异常。

去看了一眼API文档Collections的copy方法:

public static <T> void copy(List<? super T> dest,
List<? extends T> src)
Copies all of the elements from one list into another. After the operation, the index of each copied element in the destination list will be identical to its index in the source list. The destination list must be at least as long as the source list. If it is longer, the remaining elements in the destination list are unaffected.
This method runs in linear time.
Type Parameters:
T - the class of the objects in the lists
Parameters:
dest - The destination list.
src - The source list.
Throws:
IndexOutOfBoundsException - if the destination list is too small to contain the entire source List.
UnsupportedOperationException - if the destination list's list-iterator does not support the set operation.

    后来打印出des.size()才知道des的size为0;srcList.size()表示的是这个List的容纳能力为5,并不是说des中就有了5个元素。上面的api可以看出它的capacity(容纳能力大小)可以指定(最好指定)。而初始化时size的大小永远默认为0,只有在进行add和remove等相关操作 时,size的大小才变化。然而进行copy()时候,首先做的是将des的size和src的size大小进行比较,只有当des的 size 大于或者等于src的size时才进行拷贝,否则抛出IndexOutOfBoundsException异常。

使用以下方法可以解决上述问题

List<Person> srcList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            srcList.add(new Person("dale dawson", i));
        }
        List<Person> desList=new ArrayList<>(Arrays.asList(new Person[srcList.size()]));
        Collections.copy(desList, srcList);

List<Person> desList=new ArrayList<>(Arrays.asList(new Person[srcList.size()]));

使用Arrays.asList()里面传入一个对象和list的长度

通过打印可以发现两个list一模一样,大功告成。

希望对你们有所帮助,随手点亮小红心~~

相关文章

网友评论

      本文标题:[Java错误]Collections的copy方法拷贝Arra

      本文链接:https://www.haomeiwen.com/subject/jcspyqtx.html