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(不可变的)。
以上方法同理,不解释!
相关文章推荐
- Java之Collections工具类方法使用以及源码分析(三)
- Java之Collections工具类方法使用以及源码分析(二)
- Java之Collections工具类方法使用以及源码分析(一)
- JAVA源码分析之---Object类(二)---hashCode,equals,clone方法的使用
- 【Java源码分析】集合框架-Collections工具类-Arrays工具类
- java学习之旅57、58--数组_StringBuilder和StringBuffer的使用_JDK源码分析内部机制、常用方法补充_常见面试题答法
- java学习之旅56--数组_StringBuilder和StringBuffer的使用_常用方法_方法链的实现_JDK源码分析
- java 集合中的Collections.sort()排序方法的源码分析(一)
- Java常用工具类Collections源码分析
- Collections.sort方法排序,以及java8前后版本的使用
- JAVA源码分析之---Object类(一)---registerNatives,getClass方法的使用
- C#中Queue<T>类的使用以及部分方法的源码分析
- String源码分析之Java中的String为什么是不可变的以及replace方法源码分析
- C#中Queue<T>类的使用以及部分方法的源码分析
- java hashMap 简单使用以及深度分析
- Java Collections Framework之ArrayList源码分析
- jQuery插件-jRating评分插件源码分析及使用方法
- JAVA 对象序列化(三)——transient以及Externalizable的一种替代方法(使用Serializable)
- 线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析
- Javascript笔记:jQuery源码分析以及从jQuery对象创建的角度理解extend方法的原理