Java之Collections工具类方法使用以及源码分析(四)

来源:互联网 发布:单片机 如何打印二维码 编辑:程序博客网 时间:2024/04/28 14:03
 
static <T> void copy(List<? super T> dest, List<? extends T> src)     将所有元素从一个列表复制到另一个列表。
       

这个copy有点不便利使用:

package com.daxin.collections;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;public class Main11 {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();for (int i = 1; i <= 5; i++) {list.add(i);}System.out.println(list.size() + 1);// 报错:Exception in thread "main" java.lang.IndexOutOfBoundsException:// Source does not fit in dest,报错原因是容量和大小概念的混淆// ArrayList<Integer> copy = new ArrayList<>(list.size());System.out.println("-------------------------正确使用:------------------------------------");//将copy大小设置为list.size(),并且每一个元素位置填充0ArrayList<Integer> copy = new ArrayList<>(Arrays.asList(new Integer[list.size()]));System.out.println(copy.size());System.out.println(list.size());Collections.copy(copy, list);System.out.println(copy);}}

重点:不要混淆容量和大小的关系,大小永远小于等于容量!



 static boolean disjoint(Collection<?> c1, Collection<?> c2)   如果两个指定 collection 中没有相同的元素,则返回 true。

package com.daxin.collections;import java.util.ArrayList;import java.util.Collections;public class Main12 {public static void main(String[] args) {ArrayList<Integer> list1 = new ArrayList<>();for (int i = 1; i <= 5; i++) {list1.add(i);}ArrayList<Integer> list2 = new ArrayList<>();for (int i = 6; i <= 10; i++) {list2.add(i);}ArrayList<Integer> list3 = new ArrayList<>();for (int i = 2; i <= 6; i++) {list3.add(i);}System.out.println(Collections.disjoint(list1, list2));System.out.println(Collections.disjoint(list2, list3));System.out.println(Collections.disjoint(list1, list3));}}

源码分析:
public static boolean disjoint(Collection<?> c1, Collection<?> c2) {Collection<?> contains = c2; //set或者是size较大的集合Collection<?> iterate = c1;if (c1 instanceof Set) {//如果c1是setiterate = c2;contains = c1;} else if (!(c2 instanceof Set)) {//c1和c2都不是set的话int c1size = c1.size();int c2size = c2.size();if (c1size == 0 || c2size == 0) {//都空直接返回truereturn true;}if (c1size > c2size) {iterate = c2;contains = c1;}}//上面主要保证的是contains引用的size较大的集合或者为set的集合for (Object e : iterate) {//对少的元素进行遍历判断是否包含if (contains.contains(e)) {return false;}}return true;}
看注释!!!

emptyList()方法使用:
package com.daxin.collections;import java.util.Collections;public class Main13 {public static void main(String[] args) {Collections.emptyList();//一般适用于返回值为List的方法作为null时候的返回值,可以避免空指针异常//返回的就是java.util.Collections.EmptyList<E>,自行查看源码便知道,就是对原有的list方法进行约束}}



static <K,V> Map<K,V>   emptyMap()     返回空的映射(不可变的)。 
static <T> Set<T>   emptySet()      返回空的 set(不可变的)。 
  以上方法同理,不解释!




0 0
原创粉丝点击