今天在用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的博客,从他的博文上面了解到了机制和原理,后面终于解决了问题
分享到:
相关推荐
6. **集合拷贝**:`Collections.copy(List<T> dest, List<? extends T> src)`可以将源列表中的元素复制到目标列表。 7. **集合最小/最大值**:`Collections.min/Max(Collection<? extends T> coll)`可以找到集合中...
- **拷贝**:`Collections.copy(List<T> dest, List<? extends T> src)` 用于将一个List中的内容复制到另一个List中。 - **最大值和最小值**:`Collections.max(Collection<? extends T> coll)` 和 `Collections....
- `Collections.copy()`方法可以方便地将一个列表的所有元素复制到另一个列表,但请注意,这只是浅拷贝,原始列表的引用没有改变。如果需要完全独立的副本,需要进行深拷贝,这可能需要自定义实现或使用Cloneable...
对于对象类型的数组,可以使用 `java.util.Collections.copy()` 方法。但需要注意的是,此方法只适用于列表(List),因此我们需要将数组转换为列表形式。 ```java List<Character> sourceList = Arrays.asList...
在C#编程中,System.Collections命名空间包含了许多非泛型集合接口,这些接口是.NET框架早期版本的基础,尽管现在泛型集合接口(如`IEnumerable<T>`)更为常用,但理解非泛型接口对于维护旧代码或处理特定场景仍然很...
- `copy(List<? super T> dest, List<? extends T> src)`: 将src列表的所有元素复制到dest列表中,dest列表的大小应足够容纳src的所有元素,否则会抛出异常。 4. **同步控制**: - `synchronizedList(List<T> ...
在上述示例中,如果 `firstMovedIndex` 或 `lastMoveIndex` 不正确,`Collections.copy()` 方法会抛出 `IllegalArgumentException`。确保 `firstMovedIndex` 大于等于0且小于 `list.size()`,以及 `lastMoveIndex` ...
Jar包冲突问题原理及解决方案 在 Java 项目中,Jar 包冲突是一个常见的问题,它可以导致项目无法正常运行或出现异常。那么,什么是 Jar 包冲突?它是如何发生的?如何解决?本文将从原理上深入探讨 Jar 包冲突问题...
1. **集合转换**:Collections提供了转换方法,如`Collections.copy()`,它可以将一个集合的内容复制到另一个集合中。这对于创建集合的副本或进行集合操作非常有用。 2. **集合同步**:在多线程环境中,集合的安全...
Collections.copy(list2, list1); System.out.println(list2); // 输出结果:[a, b, c, x, x] ``` 以上就是关于Java中工具类-正则表达式的详细介绍,这些工具类和方法在日常开发中非常实用,掌握它们可以帮助...
3. **复制**:`Collections.copy()`方法可以将一个集合的所有元素复制到另一个集合中,前提是目标集合的容量足够大。 4. **反转**:`Collections.reverse()`方法可以将集合中的元素顺序反转。 5. **集合的空检查**...
例如,`Collections.sort()`方法可以对List进行排序,`Collections.copy()`用于将一个列表的内容复制到另一个列表。 以下是一个简单的`Collection`接口方法使用示例: ```java import java.util.*; public class ...
Collections.copy(des, list); // ...其他操作... } } ``` 总结: Arrays和Collections工具类是Java开发中不可或缺的辅助工具,它们大大简化了对数组和集合的操作,提高了代码的可读性和效率。了解并熟练运用...
Collections.copy(list, list2); ``` 此处将`list2`复制到`list`,并覆盖`list`原有的元素。 ```java Collections.swap(list, 2, 1); ``` 交换`list`中索引为1和2的元素位置。 #### 4. EventObject `EventObject`是...
4. `Collections.copy()`: 将一个集合的内容复制到另一个集合。 六、并发集合 Java提供了线程安全的集合实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,适用于多线程环境。 七、实用工具类 `Collections...
7. **性能优化**:在处理大量数据时,如果需要创建独立的子列表副本,可以考虑使用`Collections.copy()`方法,这将创建一个真正独立的新列表,而不是共享视图。 8. **课程资源**:提供的课程资源可能包括详细的解释...
`clone()`方法可以浅拷贝集合,而`Collections.copy()`方法可以深拷贝指定长度的元素。 9. **集合的遍历方式**: 除了迭代器,还可以使用增强for循环(foreach)来遍历集合。 10. **集合框架的设计模式**: ...
- `Collections.copy()`:深拷贝,实际复制元素。 - `addAll()`:将一个集合中的元素添加到另一个集合。 通过学习和实践“Java_jihe2”中的源码,你可以更深入地理解这些知识点,并掌握如何在实际项目中灵活运用...
- 使用`clone()`、`toArray()`、`Collections.copy()`进行集合复制。 - `List`到`Array`的转换,`Arrays.asList()`将数组转换为List,`ArrayList.toArray()`将List转换回数组。 8. **集合的操作**: - 添加元素...
49. 使用Collections.unmodifiableXXX()方法或Collections.copy()到不可变集合可防止修改。 50. 队列先进先出(FIFO),栈先进后出(LIFO)。 51. Java 8的ConcurrentHashMap弃用分段锁是因为分段锁在多核CPU环境...