目录
1.数组转集合(引用类型数组)
2.数组转集合(基础类型数组)
3.集合转数组
4.集合之间是否相交
5.获取两个集合的交集
6.集合转为字符串
1.数组转集合(引用类型数组)
(1)Arrays.asList
示例:
String[] colArr = new String[6];colArr[0] = "1";colArr[1] = "2";colArr[2] = "3";colArr[3] = "4";colArr[4] = "5";List<String> strings1 = Arrays.asList(colArr);// 集合大小System.out.println("集合大小:"+strings1.size());System.out.println("集合1修改前:"+strings1);colArr[5] = "6";colArr[4] = "44";// 数组修改集合也会修改,是浅拷贝的方式,底层共用一个内存地址System.out.println("集合1修改后:"+strings1);// 集合改变数组也会改变// 修改前的数组System.out.println("修改前的数组:"+colArr[0]);strings1.set(0,"11");System.out.println("修改后的数组:"+colArr[0]);// 转换后的集合不能进行删除strings1.remove(0);// Exception in thread "main" java.lang.UnsupportedOperationException// at java.util.AbstractList.remove(AbstractList.java:161)// at com.kingagroot.info.em.Test1.main(Test1.java:28)// 转换后的集合不能进行添加strings1.add("77");// 报错如下:// Exception in thread "main" java.lang.UnsupportedOperationException// at java.util.AbstractList.add(AbstractList.java:148)// at java.util.AbstractList.add(AbstractList.java:108)// at com.kingagroot.info.em.Test1.main(Test1.java:28)
执行结果:
集合大小:6
集合1修改前:[1, 2, 3, 4, 5, null]
集合1修改后:[1, 2, 3, 4, 44, 6]
修改前的数组:1
修改后的数组:11
说明:
①使用Arrays.asList方法将数组转为集合
②转换前的数组和转换后的集合共用一个内存地址,数组中的元素改变,集合中的元素也会同时发生变化;反之,集合中元素改变,数组也同时发生变化。
③转换后的集合不能进行删除和增加,阅读源码可以发现,执行asList方法,会new一个ArrayList,这是Arrays的一个静态内部类,继承了AbstractList,AbstractList是不支持进行删除和增加的。
(2)new ArrayList<>(Arrays.asList(arr))
示例:
String[] colArr = new String[6];colArr[0] = "1";colArr[1] = "2";colArr[2] = "3";colArr[3] = "4";colArr[4] = "5";List<String> strings1 = new ArrayList<>(Arrays.asList(colArr));// 集合大小System.out.println("集合大小:"+strings1.size());System.out.println("集合1修改前:"+strings1);colArr[5] = "6";colArr[4] = "44";// 数组修改集合不会修改System.out.println("集合1修改后:"+strings1);// 集合修改数组不会修改// 修改前的数组System.out.println("修改前的数组:"+colArr[0]);strings1.set(0,"11");System.out.println("修改后的数组:"+colArr[0]);// 转换后的集合能进行删除strings1.remove(0);System.out.println("删除后的集合:"+strings1);// 转换后的集合能进行添加strings1.add("77");System.out.println("增加后的集合:"+strings1);
执行结果:
集合大小:6
集合1修改前:[1, 2, 3, 4, 5, null]
集合1修改后:[1, 2, 3, 4, 5, null]
修改前的数组:1
修改后的数组:1
删除后的集合:[2, 3, 4, 5, null]
增加后的集合:[2, 3, 4, 5, null, 77]
说明:
①使用new ArrayList<>(Arrays.asList(arr))将数组转为集合
②通过new的方式,数组修改,转换后的集合不会修改,反之也是如此
③转换后的集合可以进行删除和增加
(3)Collections.addAll
示例:
String[] colArr = new String[6];colArr[0] = "1";colArr[1] = "2";colArr[2] = "3";colArr[3] = "4";colArr[4] = "5";List<String> strings1 = new ArrayList<>();Collections.addAll(strings1,colArr);// 集合大小System.out.println("集合大小:"+strings1.size());System.out.println("集合1修改前:"+strings1);colArr[5] = "6";colArr[4] = "44";// 数组修改集合不会修改System.out.println("集合1修改后:"+strings1);// 集合修改数组不会修改// 修改前的数组System.out.println("修改前的数组:"+colArr[0]);strings1.set(0,"11");System.out.println("修改后的数组:"+colArr[0]);// 转换后的集合能进行删除strings1.remove(0);System.out.println("删除后的集合:"+strings1);// 转换后的集合能进行添加strings1.add("77");System.out.println("增加后的集合:"+strings1);
执行结果:
集合大小:6
集合1修改前:[1, 2, 3, 4, 5, null]
集合1修改后:[1, 2, 3, 4, 5, null]
修改前的数组:1
修改后的数组:1
删除后的集合:[2, 3, 4, 5, null]
增加后的集合:[2, 3, 4, 5, null, 77]
说明:
①其原理就是循环数组,将数组的所有元素添加到集合中。
②通过new的方式创建,所有数组和集合使用不同的内存地址,一方改变,另一方不会发生变化。
③转换后的集合可以进行修改和增加。
2.数组转集合(基础类型数组)
(1)Arrays.asList
示例:
int[] colArr = new int[6];colArr[0] = 1;colArr[1] = 2;colArr[2] = 3;colArr[3] = 4;colArr[4] = 5;List<int[]> ints = Arrays.asList(colArr);System.out.println("数组大小:" + ints.size());System.out.println("数组内容:" + ints.get(0));
执行结果:
数组大小:1
数组内容:[I@4361bd48
说明:
①基础数据类型的数组转换后,是基础数据类型数组的集合,集合中只有一个人元素,就是数组。
②基础类型不能用作泛型,源码中的a接收引用类型。
public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}
③如果要生成每个数组元素的集合,参照(2)的方式,使用基础数据类型的包装类
(2)Arrays.asList
示例:
Integer[] colArr = new Integer[6];colArr[0] = 1;colArr[1] = 2;colArr[2] = 3;colArr[3] = 4;colArr[4] = 5;List<Integer> ints = Arrays.asList(colArr);System.out.println("数组大小:" + ints.size());System.out.println("数组内容:" + ints);
执行结果:
数组大小:6
数组内容:[1, 2, 3, 4, 5, null]
说明:
①使用基础类型的包装类作为数组的类型,可以生成每个数组元素的集合类
3.集合转数组
示例:
List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");list.add("4");list.add("5");list.add("6");String[] strArr = list.toArray(new String[list.size()]);System.out.println("修改前数组:" + strArr.length);// 集合改变数组不会发生变化list.add("7");System.out.println("修改后数组:" + strArr.length);// 数组中元素的内容可以改变strArr[0] = "11";System.out.println(strArr[0]);
执行结果:
修改前数组:6
修改后数组:6
11
说明:
①使用list.toArray方法
②集合改变后数组不会随之改变
参照:https://blog.51cto.com/liuchenyang0515/6422343
4.集合之间是否相交
示例:
List<String> list1 = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7"));List<String> list2 = new ArrayList<>(Arrays.asList("1", "2", "33", "44", "55", "6", "7"));List<String> list3 = new ArrayList<>(Arrays.asList("11", "22", "33", "44", "55", "66", "77"));// 方法1 使用Collections.disjoint,没有交集返回true,有交集则返回falseSystem.out.println("方法1------------------");System.out.println(Collections.disjoint(list1, list2));System.out.println(Collections.disjoint(list1, list3));// 方法2 使用CollectionUtils.containsAny,有交集返回true,没有返回falseSystem.out.println("方法2------------------");System.out.println(CollectionUtils.containsAny(list1, list2));System.out.println(CollectionUtils.containsAny(list1, list3));// 方法3 使用CollectionUtil.containsAny,有交集返回true,没有则返回falseSystem.out.println("方法3------------------");System.out.println(CollectionUtil.containsAny(list1, list2));System.out.println(CollectionUtil.containsAny(list1, list3));// 方法4 使用java8的新特性System.out.println("方法4------------------");List<String> coll1 = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList());if (CollUtil.isNotEmpty(coll1)) {System.out.println("有交集");} else {System.out.println("没有交集");}List<String> coll2 = list1.stream().filter(item -> list3.contains(item)).collect(Collectors.toList());if (CollUtil.isNotEmpty(coll2)) {System.out.println("有交集");} else {System.out.println("没有交集");}List<String> coll3 = list1.stream().filter(list2::contains).collect(Collectors.toList());if (CollUtil.isNotEmpty(coll3)) {System.out.println("有交集");} else {System.out.println("没有交集");}List<String> coll4 = list1.stream().filter(list3::contains).collect(Collectors.toList());if (CollUtil.isNotEmpty(coll4)) {System.out.println("有交集");} else {System.out.println("没有交集");}
执行结果:
方法1------------------
false
true
方法2------------------
true
false
方法3------------------
true
false
方法4------------------
有交集
没有交集
有交集
没有交集
说明:
①全限定名为java.util.Collections,在俩个集合没有交集的时候会返回true,否则返回false。
②全限定名为:org.apache.commons.collections.CollectionUtils,两个集合有交集会返回true,否则会返回false,跟Collections.disjoint相反。
③全限定名为:cn.hutool.core.collection.CollectionUtil,两个集合有交集会返回true,否则会返回false,跟Collections.disjoint相反。
④使用Java8的新特性
5.获取两个集合的交集
示例:
List<String> list1 = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7"));List<String> list2 = new ArrayList<>(Arrays.asList("1", "2", "33", "44", "55", "6", "7"));List<String> list3 = new ArrayList<>(Arrays.asList("11", "22", "33", "44", "55", "66", "77"));// 方式1List<String> result1 = new ArrayList<>();for (String data : list1) {if (list2.contains(data) && !result1.contains(data)) {result1.add(data);}}System.out.println("集合1和集合2的交集:" + result1);List<String> result2 = new ArrayList<>();for (String data : list1) {if (list3.contains(data) && !result1.contains(data)) { // 去重result1.add(data);}}System.out.println("集合1和集合3的交集:" + result2);// 方式2List<String> result3 = new ArrayList<>();list1.forEach(item -> {if (list2.contains(item) && !result3.contains(item)) {result3.add(item);}});System.out.println("集合1和集合2的交集:" + result1);List<String> result4 = new ArrayList<>();list1.forEach(item -> {if (list3.contains(item) && !result3.contains(item)) {result3.add(item);}});System.out.println("集合1和集合3的交集:" + result4);// 方式3List<String> result5 = new ArrayList<>();result5 = list1.stream().filter(list2::contains).collect(Collectors.toList());System.out.println("集合1和集合2的交集:" + result5);List<String> result6 = new ArrayList<>();result6 = list1.stream().filter(list3::contains).collect(Collectors.toList());System.out.println("集合1和集合3的交集:" + result6);
执行结果:
集合1和集合2的交集:[1, 2, 6, 7]
集合1和集合3的交集:[]
集合1和集合2的交集:[1, 2, 6, 7]
集合1和集合3的交集:[]
集合1和集合2的交集:[1, 2, 6, 7]
集合1和集合3的交集:[]
说明:
①通过循环其中一个集合,判断集合的每个元素是否在另一个集合中存在,如果存在并且在新集合中不存在则将元素添加到新集合中。
②去重也可以使用hashset进行去重。
List<String> list4 = Arrays.asList("1", "1", "2", "2", "3");HashSet<String> set1 = new HashSet<>(list4);List<String> list5 = new ArrayList<>(set1);System.out.println("去重前:" + list4);System.out.println("去重前:" + list5);
参照:Java判断两个集合是否具有交集及如何获得交集详解_java_脚本之家
6.集合转为字符串
示例:
List<String> list1 = new ArrayList<>(Arrays.asList("1", "2", "3", "4", "5", "6", "7"));System.out.println(list1.stream().collect(Collectors.joining(",")));
执行:
1,2,3,4,5,6,7