数组转为集合的方法

  • Arrays.asList()方法转为集合
    • asList源码
  • jdk1.8中,将数组转为stream流,使用collect(Collectors.toList())
    • toList源码
  • 总结

Arrays.asList()方法转为集合

 @Testvoid testAsList() {String[] str = new String[] { "qqq", "kkk" };List list = Arrays.asList(str);list.add("lqk");
//        str[0]="lqk";list.stream().forEach(System.out::println);}

结果:报错:java.lang.UnsupportedOperationException

    @Testvoid testAsList() {String[] str = new String[] { "qqq", "kkk" };List list = Arrays.asList(str);
//        list.add("lqk");str[0]="lqk";list.stream().forEach(System.out::println);}

结果:集合也被修改,说明数组str[]与集合list底层都是原数组

第一种情况:list.add(“lqk”); 运行时异常。
第二种情况:str[0] = “lqk”; 那么 list.get(0)也会随之修改。
说明:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList
体现的是适配器模式,只是转换接口,后台的数据仍是数组。

asList源码

    @SafeVarargs@SuppressWarnings("varargs")public static <T> List<T> asList(T... a) {return new ArrayList<>(a);//调用下面的ArrayList(E[] array)构造函数}
    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);//直接将array赋值给a,底层都是同一个数组}@Overridepublic int size() {return a.length;}@Overridepublic Object[] toArray() {return a.clone();}@Override@SuppressWarnings("unchecked")public <T> T[] toArray(T[] a) {int size = size();if (a.length < size)return Arrays.copyOf(this.a, size,(Class<? extends T[]>) a.getClass());System.arraycopy(this.a, 0, a, 0, size);if (a.length > size)a[size] = null;return a;}@Overridepublic E get(int index) {return a[index];}@Overridepublic E set(int index, E element) {E oldValue = a[index];a[index] = element;return oldValue;}@Overridepublic int indexOf(Object o) {E[] a = this.a;if (o == null) {for (int i = 0; i < a.length; i++)if (a[i] == null)return i;} else {for (int i = 0; i < a.length; i++)if (o.equals(a[i]))return i;}return -1;}@Overridepublic boolean contains(Object o) {return indexOf(o) != -1;}@Overridepublic Spliterator<E> spliterator() {return Spliterators.spliterator(a, Spliterator.ORDERED);}@Overridepublic void forEach(Consumer<? super E> action) {Objects.requireNonNull(action);for (E e : a) {action.accept(e);}}@Overridepublic void replaceAll(UnaryOperator<E> operator) {Objects.requireNonNull(operator);E[] a = this.a;for (int i = 0; i < a.length; i++) {a[i] = operator.apply(a[i]);}}@Overridepublic void sort(Comparator<? super E> c) {Arrays.sort(a, c);}}

jdk1.8中,将数组转为stream流,使用collect(Collectors.toList())

    @Testvoid testToList(){String[] str = new String[] { "qqq", "kkk" };List<String> collect = Arrays.stream(str).collect(Collectors.toList());collect.add("lqk");
//        str[0]="lqk";collect.stream().forEach(System.out::println);}

结果:添加成功,没有报错

    @Testvoid testToList(){String[] str = new String[] { "qqq", "kkk" };List<String> collect = Arrays.stream(str).collect(Collectors.toList());
//        collect.add("lqk");str[0]="lqk";collect.stream().forEach(System.out::println);}

结果:修改数组后,collect集合并不受影响

toList源码

public static <T>
Collector<T, ?, List<T>> toList() {//Supplier生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,//new出来一个ArraysList(left, right) -> { left.addAll(right); return left; },CH_ID);
}
static class CollectorImpl<T, A, R> implements Collector<T, A, R> {//CollectorImpl实现Collector接口CollectorImpl(Supplier<A> supplier,//CollectorImpl的构造函数,生成Collector对象BiConsumer<A, T> accumulator,BinaryOperator<A> combiner,Set<Characteristics> characteristics) {this(supplier, accumulator, combiner, castingIdentity(), characteristics);}
}

总结

使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它add/remove/clear 方法会抛出 UnsupportedOperationException 异常。如果想转为集合后对该集合进行数据增、删、改操作,主要使用第二种方法

数组转为集合的方法解析相关推荐

  1. 通过Arrays.asList数组转为集合的坑

    首先定义一个int类型的数组 int[] arr = {1,2,3};// 将数组转为集合并输出List<int[]> ints = Arrays.asList(arr);System.o ...

  2. php将数组转为字符串的方法

    php脚本中可以使用 implode() 或 json_encode 函数将数组转字符串,但他们转换的字符串格式是不同的,其操作方法可以参考下面的文章. php 数组转字符串的方法 1.implode ...

  3. 数组转集合的方法(注意事项)

    1.转换方法 1.遍历的方式,依次添加到集合中. 2.Arrays.asList()方法 3.List.of()方法 4.Collections.addAll(集合,数组)方法,将集合存储到数组中 1 ...

  4. java数组转为集合的两种常用方法

    方法一 Integer[] a = {1,2,3,4,5,6};//使用Arrays.asList(a)时 数组需要定义为包装类新 List<Integer> integers = Arr ...

  5. Java 集合转数组,数组转集合

    List集合转数组: 集合自带的toArray方法,一种是默认的为Object类型,另一种可以自己指定数组的类型,但必须是引用类型. 遍历集合,然后依次添加到集合当中 public class Typ ...

  6. javascript数组的属性、方法和清空-最全!!!(必看)

    今天经理要我从新看一遍js,当我再看<精通js和jquery>这本书时,发现关于数组的这章节讲的很少,于是想自己总结一下数组的常用方法. 定义数组: var arr = new Array ...

  7. Java数组转集合之Arrays.asList()用法

    Arrays.asList()用法 使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. 而一开始asList的设计时用于打印数组而设计 ...

  8. 【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )

    文章目录 I . C/C++ 中的 Java 字符串数组类型 II . 获取字符串数组长度 III . 获取字符串数组元素 IV . 类型强转 ( jobject -> jstring ) V ...

  9. 将int数组转为List集合

    将int数组转为List集合 一.在使用Arrays.asList将int数组转换为List时,存在问题 (一)存在局限性,传入的数组一定要是引用类型才能将其转换为List集合,当传入基本数据类型时, ...

  10. JAVA SE学习day_11:集合的相关应用、增强型for循环、foreach方法、数组与集合的相互转换

    一.集合的相关应用 1.1 将一个集合加到另一个集合上 boolean addAll(Collection c) 将给定集合中的所有元素添加到当前集合中.调用方法之后只要c1集合发生变化就返回true ...

最新文章

  1. eclipse opengl java_OpenGL 之 Eclipse 开发环境搭建 | 学步园
  2. 字典树andXOR*
  3. 用DPM(Deformable Part Model,voc-release3.1)算法在INRIA数据集上训练自己的人体检测模型
  4. 全局静态存储区、堆区和栈区深入剖析
  5. 四种struts2访问web元素的方式
  6. rds for mysql的监控指标_mysql(RDS)常用性能指标监控
  7. [转载]了解Linux的进程与线程
  8. Bootstrap3 滚动监听插件的调用方式
  9. 持有1000枚以上比特币的巨鲸地址数量有所下降
  10. Keras-Sequential模型(2)
  11. 更改oracle字符集为utf_oracle字符集AL16UTF16改为ZHS16GBK
  12. java导出excel 客户端_java如何将导出的excel下载到客户端
  13. 设置配置高可用的Mysql双机热备(Mysql_HA)
  14. Java 参数类型后面三个点,可变参数列表
  15. 【Arc GIS 零基础教学】常用的环境科学与工程专业英语词汇分享
  16. 企业微信聊天记录如何转移到新手机上?
  17. 【pyecharts库与pandas库】利用pyecharts库根据表格中的GDP数据绘制2021年中国各省GDP热力图和GDP较低的五个省的人均GDP与人口的柱状图
  18. WIN7封装教程2018系列(六)—封装
  19. 实战演练-java+微信小程序实现省市区三级联动
  20. android 强制开启wifi,强制Android使用无网络的Wifi网络

热门文章

  1. VS2010 由于应用程序配置不正确,程序未能启动”--原因及解决方法
  2. 2022年陕西中级审计师考试练习题及答案
  3. c# midi播放器_C#中的MIDI文件切片器和MIDI库
  4. 提高 Mac OS X 速度的 52 个方法
  5. 锁屏对对碰_锁屏应用
  6. Google退出中国
  7. Unity-MD5加密
  8. php 打印机样式自动对齐,虚拟打印机怎么快速设置视图样式
  9. JDK/ADB环境变量配置
  10. Safari兼容IE