使用背景

总结一下最近项目中使用到集合的两个点,一个是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操作集合相关推荐

  1. js 如何将java list集合转换成var类型数组_零基础参加郑州Java培训 一定要注意Arrays.asList的用法...

    作为编程界的老大哥,Java一直是想要加入互联网行业的人的首选.为了能够更快更好地入行,很多零基础学员选择参加郑州Java培训班,跟着老师的脚步由浅入深的学习专业技术.今天千锋郑州小编就给大家分享使用 ...

  2. Arrays.aslist新建的list集合不能add()、remove()你知道吗?

    java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at java ...

  3. java集合的批量新建_java使用Arrays.asList快速创建List集合

    程序中某段案例代码如下: Map> tMap = new HashMap>(); tMap.put(name, Arrays.asList(new CronTrigger[] { trig ...

  4. 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 ...

  5. java中的asList_java中Arrays.asList的使用

    Arrays.asList()方法的作用是将数组或一些元素转为集合,而你得到的集合并不是我们通常使用的List集合,而是Arrays里面的一个内部类.阿里的开发手册上java开发规范说到使用工具类Ar ...

  6. Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  7. java stream toarray_Java集合工具类的一些坑,Arrays.asList()、Collection.toArray()...

    Arrays.asList() 使用指南 最近使用Arrays.asList()遇到了一些坑,然后在网上看到这篇文章:Java Array to List Examples 感觉挺不错的,但是还不是特 ...

  8. java 集合数组初始化_Java用Arrays.asList初始化ArrayList实例方法

    Java用Arrays.asList初始化ArrayList实例方法 发布于 2020-2-29| 复制链接 在本篇文章里小妖给大家分享的是关于Java中使用Arrays.asList初始化Array ...

  9. Exception in thread “main“ java.lang.UnsupportedOperationException Arrays.asList中add报错

    public static void main(String[] args) {List<Integer> integers = Arrays.asList(new Integer[]{1 ...

最新文章

  1. python画圣诞树代码-python圣诞树代码
  2. python 调用另一个py_跟我自学python 第9章 类(9.4.6 在一个模块中导入另一个模块)...
  3. linux记录iptables日志,iptables日志管理
  4. 父亲购房后去世,房产证还没办,后妈和父亲没结婚,户口簿上有父亲,儿子,妹妹,那房产证应该写谁的名字?
  5. SELECTION-SCREEN 加按钮
  6. HTML5-------元素使用
  7. 【SICP练习】115 练习3.41
  8. 4.数据结构 --- 串
  9. HFSS19 官方中文教程系列Workshops L01
  10. system libzip must be upgraded to version >= 0.11
  11. Android 一款十分简洁、优雅的日记 APP
  12. Packets out of order
  13. 小猫排队 (思维 模拟
  14. Long类型的数据转换
  15. windows学习记录之MFC通过URL上传下载文件
  16. 黑马训练营--IOS学习---OC语言学习总结2
  17. 以太坊 权益证明(五)
  18. 支票:现金支票转帐支票使用方法大全
  19. 力扣789——逃脱阻碍者(贪心)
  20. 淘客基地淘客微信公众号系统代理合伙人更新至1.2.3

热门文章

  1. Java基于JSP的论坛交流系统
  2. 实训小笔记之—产品经理能力模型
  3. Android学习之——操作SIM卡联系人
  4. C语言中二维字符数组的定义和初始化
  5. R语言做GGEbiplot_基于R语言的GGE双标图在大豆区试中的应用
  6. 各种机械键盘轴的区别,我到底该用什么轴?
  7. GICv3软件overview手册之虚拟化
  8. 如何配置域名的 CNAME
  9. Ubuntu-查看ubuntu系统的版本信息
  10. 2019-1-5-问答-产品经理有哪些细分领域,对应特点是什么?