java集合类的一些总结——Arrays.asList和Guava操作集合
使用背景
总结一下最近项目中使用到集合的两个点,一个是Arrays.asList这个方法使用的坑,另一个是利用Guava的Sets工具类去求并交集。
使用总结
Arrays.asList的坑
先上结论:
- Arrays.asList这个方法不适用于基本类型:byte,short,int,long,float,double,boolean
- 该方法将数组和列表动态链接起来,当其中一个更新后,另一个也会更新
- 不支持add和remove方法
(1)首先对于第一点,这个方法不适用于基本类型,并不是不能用于基本类型,看一下下面的代码:
public static void main(String[] args) {int[] int_array = {1, 2, 3};List<int[]> ints = Arrays.asList(int_array);// 对于基本类型,会打印一个元素结果System.out.println(ints);}
输出:
[[I@610455d6]
从Arrays.asList返回List的泛型可知,这个工具方法将基本类型的数组只转成了一个元素的列表。因为在Arrays.asList中,该方法接受一个变长参数,一般可以看做数组参数,但是因为int[]本身就是一个类型,所以data变量作为参数传递时,编译器认为只传了一个变量,这个变量的类型是int数组,所以会这样。基本类型是不能作为泛型的参数,按道理应该使用包装类型,这里没有报错是因为数组是可以泛型化的,所以在转换后list中有一个类型为int[]的数组。值得注意的是,如果这时打印出其中的class,会返回class[I。因为jvm不可能输出int[]对应的array类型,array属于java.lang.reflect包,通过反射访问数组这个类,编译时生成的这个class值。
(2)对于第二点,我们可以尝试改变数组中的值时,可以看看对应list中的值:
String[] string_array = {"aa", "bb", "cc"};List<String> stringList = Arrays.asList(string_array);System.out.println("============改变数组前============");System.out.println(stringList);// 改变数组string_array[1] = "change";System.out.println("============改变数组后============");System.out.println(stringList);// 改变liststringList.set(1, "change2");System.out.println("============改变list后============");System.out.println(string_array[1]);
输出结果:
============改变数组前============
[aa, bb, cc]
============改变数组后============
[aa, change, cc]
============改变list后============
change2
这个通过源码很好理解,可以看一下asList的源码:
@SafeVarargs@SuppressWarnings("varargs")public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}
new ArrayList构造函数代码:
private final E[] a;ArrayList(E[] array) {a = Objects.requireNonNull(array);}
从源码中得到asList就是将数组作为返回的List的实际引用,即List中的数组就是要转成list的数组,所以当更改数组中的值时,list中的值也会变化,list列表中的值变更也相当于变更了其中的数组,也就是源数据数组。这就是所谓的链接在一起。Arrays.asList体现的是适配器模式,只是转换接口(array到list),后台的数据仍是数组。
(3)第三点是数组转换之后的List是不支持remove和add方法的。这里说的不支持,是调用add或者remove方法之后会抛出一个异常 java.lang.UnsupportedOperationException。一开始感到奇怪,ArrayList为什么不支持add和remove方法?这里去看了返回的ArrayList的源码,这个ArrayList并不是常用的ArrayList,而是在Arrays中定义的一个内部类:
private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable{private static final long serialVersionUID = -2764017481108945198L;private final E[] a;ArrayList(E[] array) {a = Objects.requireNonNull(array);}... // 省略一些代码}
这个内部类虽然继承了AbstractList,但是没有去实现其中的add和remove方法,可以看下AbstractList中定义的默认add方法的实现:
/*** {@inheritDoc}** <p>This implementation always throws an* {@code UnsupportedOperationException}.** @throws UnsupportedOperationException {@inheritDoc}* @throws ClassCastException {@inheritDoc}* @throws NullPointerException {@inheritDoc}* @throws IllegalArgumentException {@inheritDoc}* @throws IndexOutOfBoundsException {@inheritDoc}*/public void add(int index, E element) {throw new UnsupportedOperationException();}
可以看到如果没有去实现add方法,那么会抛出这个异常,这里因为也叫做ArrayList,所以还是比较容易踩坑。clear、remove方法也是一样的原因。
关于Arrays.asList的代码github地址:
https://github.com/zhanglijun1217/java8/tree/master/src/Arrays_asList
Guava中的Sets工具类求交集
近期也去使用了一个求集合交集的场景。这里去简单记录下Guava中的这个用法。
Sets.intersection(set1, set2);
这个方法返回的是一个新的集合去承接传入两个集合的交集的。Guava也提供了对集合操作很多其他方法,比如并集、差集、全集等,这个后面会去总结。
java集合类的一些总结——Arrays.asList和Guava操作集合相关推荐
- js 如何将java list集合转换成var类型数组_零基础参加郑州Java培训 一定要注意Arrays.asList的用法...
作为编程界的老大哥,Java一直是想要加入互联网行业的人的首选.为了能够更快更好地入行,很多零基础学员选择参加郑州Java培训班,跟着老师的脚步由浅入深的学习专业技术.今天千锋郑州小编就给大家分享使用 ...
- Arrays.aslist新建的list集合不能add()、remove()你知道吗?
java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java ...
- java集合的批量新建_java使用Arrays.asList快速创建List集合
程序中某段案例代码如下: Map> tMap = new HashMap>(); tMap.put(name, Arrays.asList(new CronTrigger[] { trig ...
- java unexpected type_Java 10 赋值Arrays.asList给var变量:AssertionError: Unexpected intersection type...
体验了下Java 10的局部变量类型推断var.使用List.of()给var赋值.List list1 = Arrays.asList(1, "a",10L); var list ...
- java中的asList_java中Arrays.asList的使用
Arrays.asList()方法的作用是将数组或一些元素转为集合,而你得到的集合并不是我们通常使用的List集合,而是Arrays里面的一个内部类.阿里的开发手册上java开发规范说到使用工具类Ar ...
- Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...
Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...
- java stream toarray_Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...
Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...
- java 集合数组初始化_Java用Arrays.asList初始化ArrayList实例方法
Java用Arrays.asList初始化ArrayList实例方法 发布于 2020-2-29| 复制链接 在本篇文章里小妖给大家分享的是关于Java中使用Arrays.asList初始化Array ...
- Exception in thread “main“ java.lang.UnsupportedOperationException Arrays.asList中add报错
public static void main(String[] args) {List<Integer> integers = Arrays.asList(new Integer[]{1 ...
最新文章
- python画圣诞树代码-python圣诞树代码
- python 调用另一个py_跟我自学python 第9章 类(9.4.6 在一个模块中导入另一个模块)...
- linux记录iptables日志,iptables日志管理
- 父亲购房后去世,房产证还没办,后妈和父亲没结婚,户口簿上有父亲,儿子,妹妹,那房产证应该写谁的名字?
- SELECTION-SCREEN 加按钮
- HTML5-------元素使用
- 【SICP练习】115 练习3.41
- 4.数据结构 --- 串
- HFSS19 官方中文教程系列Workshops L01
- system libzip must be upgraded to version >= 0.11
- Android 一款十分简洁、优雅的日记 APP
- Packets out of order
- 小猫排队 (思维 模拟
- Long类型的数据转换
- windows学习记录之MFC通过URL上传下载文件
- 黑马训练营--IOS学习---OC语言学习总结2
- 以太坊 权益证明(五)
- 支票:现金支票转帐支票使用方法大全
- 力扣789——逃脱阻碍者(贪心)
- 淘客基地淘客微信公众号系统代理合伙人更新至1.2.3