目录
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,有交集则返回false
System.out.println("方法1------------------");
System.out.println(Collections.disjoint(list1, list2));
System.out.println(Collections.disjoint(list1, list3));
// 方法2 使用CollectionUtils.containsAny,有交集返回true,没有返回false
System.out.println("方法2------------------");
System.out.println(CollectionUtils.containsAny(list1, list2));
System.out.println(CollectionUtils.containsAny(list1, list3));
// 方法3 使用CollectionUtil.containsAny,有交集返回true,没有则返回false
System.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"));
// 方式1
List<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);
// 方式2
List<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);
// 方式3
List<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