`

Collections.copy()

    博客分类:
  • JAVA
阅读更多
今天在用Collections.copy()复制集合的时候出来了个问题:
java.lang.indexOutOfBoundsException:Source does not fit in dest
很明白的知道是因为什么意思,可是不知道原理究竟为什么会这样,
	List<Demo> list1=new ArrayList<Demo>();
		Demo demo = new Demo();
		demo.setName("aa");
		demo.setCode("01");
		Demo demo1 = new Demo();
		demo1.setName("bb");
		demo1.setCode("02");
		list1.add(demo);
		list1.add(demo1);
		List<Demo> lists = new ArrayList<Demo>();
		Collections.copy(lists, list1);

就报了上面的错误
List<Object> dest=new ArrayList<Object>(src.size());  
//or List<Object> dest=new ArrayList<Object>();  
Collections.copy(dest, src());  

按如上方式用时,很容易得到"Source does not fit in dest" Exception,原因是copy方法里面会首先比较dest和src的size,而往往你新new的list的size是0,所以会报错。
为什么明明已经设置了长度为src.size,为什么还会出错!
后来打印出dest.size()才知道dest的长度为0,new ArrayList<Object>(src.size())表示的是这个List的容纳能力为src.size,并不是说dest中就有了src.size个元素。查看api才知 道,它的capacity(容纳能力大小)可以指定(最好指定)。而初始化时size的大小永远默认为0,只有在进行add和remove等相关操作 时,size的大小才变化。然而进行copy()时候,首先做的是将desc1的size和src1的size大小进行比较,只有当desc1的 size 大于或者等于src1的size时才进行拷贝,否则抛出IndexOutOfBoundsException异常。

可以通过下面的方法指定目标desc的大小
List<Object> values=new ArrayList<Object>(Arrays.asList(new Object[srcList.size()]));  
Collections.copy(values, srcList());  


在这里很感谢http://darrenzhu.iteye.com/blog/1642672的博客,从他的博文上面了解到了机制和原理,后面终于解决了问题
分享到:
评论

相关推荐

    了解Collection 和 Collections

    6. **集合拷贝**:`Collections.copy(List&lt;T&gt; dest, List&lt;? extends T&gt; src)`可以将源列表中的元素复制到目标列表。 7. **集合最小/最大值**:`Collections.min/Max(Collection&lt;? extends T&gt; coll)`可以找到集合中...

    Collections Framework中的算法(之一)――综述

    - **拷贝**:`Collections.copy(List&lt;T&gt; dest, List&lt;? extends T&gt; src)` 用于将一个List中的内容复制到另一个List中。 - **最大值和最小值**:`Collections.max(Collection&lt;? extends T&gt; coll)` 和 `Collections....

    关于 Java Collections API 您不知道的 5 件事,第 1 部分

    - `Collections.copy()`方法可以方便地将一个列表的所有元素复制到另一个列表,但请注意,这只是浅拷贝,原始列表的引用没有改变。如果需要完全独立的副本,需要进行深拷贝,这可能需要自定义实现或使用Cloneable...

    java performance12

    对于对象类型的数组,可以使用 `java.util.Collections.copy()` 方法。但需要注意的是,此方法只适用于列表(List),因此我们需要将数组转换为列表形式。 ```java List&lt;Character&gt; sourceList = Arrays.asList...

    C# System.Collections 非泛型接口方法解析.pdf

    在C#编程中,System.Collections命名空间包含了许多非泛型集合接口,这些接口是.NET框架早期版本的基础,尽管现在泛型集合接口(如`IEnumerable&lt;T&gt;`)更为常用,但理解非泛型接口对于维护旧代码或处理特定场景仍然很...

    集合工具类Collections的基本应用

    - `copy(List&lt;? super T&gt; dest, List&lt;? extends T&gt; src)`: 将src列表的所有元素复制到dest列表中,dest列表的大小应足够容纳src的所有元素,否则会抛出异常。 4. **同步控制**: - `synchronizedList(List&lt;T&gt; ...

    java.lang.Exception: java.lang.IllegalArgumentException: firstMovedIndex, lastMo

    在上述示例中,如果 `firstMovedIndex` 或 `lastMoveIndex` 不正确,`Collections.copy()` 方法会抛出 `IllegalArgumentException`。确保 `firstMovedIndex` 大于等于0且小于 `list.size()`,以及 `lastMoveIndex` ...

    Jar包冲突问题原理及解决方案

    Jar包冲突问题原理及解决方案 在 Java 项目中,Jar 包冲突是一个常见的问题,它可以导致项目无法正常运行或出现异常。那么,什么是 Jar 包冲突?它是如何发生的?如何解决?本文将从原理上深入探讨 Jar 包冲突问题...

    Lesson_9_Collections

    1. **集合转换**:Collections提供了转换方法,如`Collections.copy()`,它可以将一个集合的内容复制到另一个集合中。这对于创建集合的副本或进行集合操作非常有用。 2. **集合同步**:在多线程环境中,集合的安全...

    java工具类-正则

    Collections.copy(list2, list1); System.out.println(list2); // 输出结果:[a, b, c, x, x] ``` 以上就是关于Java中工具类-正则表达式的详细介绍,这些工具类和方法在日常开发中非常实用,掌握它们可以帮助...

    Collections源码java-JavascriptExercises:来自各种来源的Java脚本练习的集合,包括书籍和课程

    3. **复制**:`Collections.copy()`方法可以将一个集合的所有元素复制到另一个集合中,前提是目标集合的容量足够大。 4. **反转**:`Collections.reverse()`方法可以将集合中的元素顺序反转。 5. **集合的空检查**...

    Java容器类PPT学习教案.pptx

    例如,`Collections.sort()`方法可以对List进行排序,`Collections.copy()`用于将一个列表的内容复制到另一个列表。 以下是一个简单的`Collection`接口方法使用示例: ```java import java.util.*; public class ...

    【Java基础笔记】Java中常用工具类.docx

    Collections.copy(des, list); // ...其他操作... } } ``` 总结: Arrays和Collections工具类是Java开发中不可或缺的辅助工具,它们大大简化了对数组和集合的操作,提高了代码的可读性和效率。了解并熟练运用...

    java集合类的基本用法

    Collections.copy(list, list2); ``` 此处将`list2`复制到`list`,并覆盖`list`原有的元素。 ```java Collections.swap(list, 2, 1); ``` 交换`list`中索引为1和2的元素位置。 #### 4. EventObject `EventObject`是...

    java的集合帮助文档

    4. `Collections.copy()`: 将一个集合的内容复制到另一个集合。 六、并发集合 Java提供了线程安全的集合实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,适用于多线程环境。 七、实用工具类 `Collections...

    Java 实例 - List 截取源代码+详细指导教程.zip

    7. **性能优化**:在处理大量数据时,如果需要创建独立的子列表副本,可以考虑使用`Collections.copy()`方法,这将创建一个真正独立的新列表,而不是共享视图。 8. **课程资源**:提供的课程资源可能包括详细的解释...

    第16章:Java集合.zip_java 集合_java集合

    `clone()`方法可以浅拷贝集合,而`Collections.copy()`方法可以深拷贝指定长度的元素。 9. **集合的遍历方式**: 除了迭代器,还可以使用增强for循环(foreach)来遍历集合。 10. **集合框架的设计模式**: ...

    Java_jihe2.rar_java集合

    - `Collections.copy()`:深拷贝,实际复制元素。 - `addAll()`:将一个集合中的元素添加到另一个集合。 通过学习和实践“Java_jihe2”中的源码,你可以更深入地理解这些知识点,并掌握如何在实际项目中灵活运用...

    Java集合案例及源代码.rar

    - 使用`clone()`、`toArray()`、`Collections.copy()`进行集合复制。 - `List`到`Array`的转换,`Arrays.asList()`将数组转换为List,`ArrayList.toArray()`将List转换回数组。 8. **集合的操作**: - 添加元素...

    java面试讲题汇总-word可打印版

    49. 使用Collections.unmodifiableXXX()方法或Collections.copy()到不可变集合可防止修改。 50. 队列先进先出(FIFO),栈先进后出(LIFO)。 51. Java 8的ConcurrentHashMap弃用分段锁是因为分段锁在多核CPU环境...

Global site tag (gtag.js) - Google Analytics