Collections中的 sort() copy() reverse() 方法总结
java.lang.IndexOutOfBoundsException: Source does not fit in dest
at java.util.Collections.copy(Unknown Source)
- sort():对集合进行排序
reverse():对集合进行逆序
public static void main(String[] args) {
List list = new ArrayList();
list.add(4);
list.add(6);
list.add(2);
list.add(8);
list.add(1);
System.out.println("原始的顺序:" + list);
Collections.sort(list);
System.out.println("排序后顺序:" + list);
Collections.reverse(list);
System.out.println("逆序后顺序:" + list);
}
输出结果:
原始的顺序:[4, 6, 2, 8, 1]
排序后顺序:[1, 2, 4, 6, 8]
逆序后顺序:[8, 6, 4, 2, 1]
2.值得一说的是 copy(List dest, List src),上面的报错信息说的就是copy()的错误
copy(dest,src):是将src中的数据复制到dest
如果这样写:
List list = new ArrayList();
list.add("d");
list.add("c");
list.add("a");
list.add("e");
list.add("b");
List list2 = new ArrayList();
Collections.copy(list2, list);
System.out.println(list);
System.out.println(list2);
就会出现如下错误:
java.lang.IndexOutOfBoundsException: Source does not fit in dest
at java.util.Collections.copy(Unknown Source)
原因:此方法是深拷贝,不光拷贝的是src的元素(引用),src内每个元素的所指向的对象都进行一次拷贝。即是两个list的每个元素所指向的不是同一内存。进行拷贝时你必须要注意目标链表的长度必须要比源链表的长度大或者相等。
此时,我们给list指定一个长度,这样应该没问题了吧:
List list = new ArrayList();
list.add("d");
list.add("c");
list.add("a");
list.add("e");
list.add("b");
List list2 = new ArrayList(5);
Collections.copy(list2, list);
System.out.println(list);
System.out.println(list2);
运行后发现,还是报同样的错误!
打印出list2的size发现是0,5表示的是这个List的容纳能力为5,并不是说list2中就有了5个元素。它的capacity(容纳能力大小)可以指定,但是初始化时size的大小永远默认为0,只有在进行add和remove等相关操作时,size的大小才会发生变化。而进行copy()时候,首先做的是将list的size和list2的size大小进行比较,只有当list2的size大于或者等于list的size时才进行拷贝,否则抛出IndexOutOfBoundsException异常。
因此,我们通过下面的方法来指定list2的大小:
List list = new ArrayList();
list.add("d");
list.add("c");
list.add("a");
list.add("e");
list.add("b");
List<Object> list2 = Arrays.asList(new Object[list.size()]);
Collections.copy(list2, list);
System.out.println(list);
System.out.println(list2);
}
输出结果:
[d, c, a, e, b]
[d, c, a, e, b]