您的位置:首页 > 编程语言 > Java开发

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

2017-03-11 22:06 585 查看
 
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(),并且每一个元素位置填充0
ArrayList<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是set
iterate = c2;
contains = c1;
} else if (!(c2 instanceof Set)) {

//c1和c2都不是set的话
int c1size = c1.size();
int c2size = c2.size();
if (c1size == 0 || c2size == 0) {//都空直接返回true
return 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(不可变的)。 

  以上方法同理,不解释!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐