Arrays.asList的坑

简介: Arrays.asList的坑

我认为对于一切情况,只有“热爱”才是最好的老师。——爱因斯坦

今天写代码遇到一个坑

本身不是什么难的逻辑,结果自己学艺不精忘了,导致程序出现不该出现的异常

是这样的,数据库里原有存了这么几张图片,使用的是“;”分割

现在要进行一个追加并去重的操作

// 原有数据库里的图片
String pic = "http://p16.qhimg.com/bdm/960_593_0/t0195d14f593431562a.jpg;" +
        "http://p18.qhimg.com/bdm/480_296_0/t014a0ca534d64adbba.jpg;" +
        "http://p18.qhimg.com/bdm/480_296_0/t014a0ca534d64adbba.jpg;" +
        "http://p18.qhimg.com/bdm/480_296_0/t014a0ca534d64adbba.jpg";
// 需要追加的图片
String appendPic = "http://p19.qhimg.com/bdm/960_593_0/t01b24e85dc07d47b0d.jpg";

现在做一个操作,追加并去重,转换成String

一开始我想着用“;”分割成数组,转换成list 然后追加、去重,再转换成原来格式(每张图片用“;”分割)

String

于是就有了下面这段问题代码

// 用“;”分割成数组并转换成List
List<String> picList = Arrays.asList(pic.split(";"));
// 添加元素
picList.add(appendPic);
// 去重,转换成String,并且中间用“;”分割
pic = picList.stream().distinct().collect(Collectors.joining(";"));
// 输出结果
System.out.println(pic);

貌似没问题,结果一运行…程序抛出了UnsupportedOperationException

瞬间想起来!asList()的返回对象是一个Arrays的内部类,它并没有实现集合个数的相关修改方法!

于是改成了下面这种方式

// 直接在字符串后追加“;”和图片url
pic = pic.concat(";").concat(appendPic);
// 用“;”分割成数组并转换成List,去重后再转换为String,用“;”分隔
pic = Arrays.stream(pic.split(";")).distinct().collect(Collectors.joining(";"));
// 输出结果
System.out.println(pic);

运行正常,输出结果

成功!

这里我补充一下,使用Listset()函数进行对List元素的修改,相应的原有数组的值也会被修改,但是不能进行修改元素个数的任何操作,否则会抛出UnsupportedOperationException

给个《码出高效》给出的例子吧

String[] stringArray = new String[3];
stringArray[0] = "one";
stringArray[1] = "two";
stringArray[2] = "three";
List<String> stringList = Arrays.asList(stringArray);
stringList.set(0, "oneList");
stringList.forEach(System.out::println);
System.out.println("-----------");
for (String s : stringArray) {
    System.out.println(s);
}
// 以下三行代码编译正确,但都会抛出运行时异常
stringList.add("four");
stringList.remove(2);
stringList.clear();

运行结果

相关文章
Arrays.asList、ArrayList.subList使用规范
Arrays.asList、ArrayList.subList使用规范
Arrays.asList之后不要调用修改操作
Arrays.asList之后不要调用修改操作
|
7月前
|
Java API Apache
Arrays.asList():使用指南
Arrays.asList() 是一个 Java 的静态方法,它可以把一个数组或者多个参数转换成一个 List 集合。这个方法可以作为数组和集合之间的桥梁,方便我们使用集合的一些方法和特性。本文将给大家介绍 Arrays.asList() 的语法、应用场景、坑点和总结。
92 0
|
7月前
|
Java C++
List.of() Vs Arrays.asList()
在上面的示例中,List.of() 用于创建不可变的颜色列表。任何通过添加或删除元素来修改列表的尝试都将导致抛出异常。 Arrays.asList() 当我们想要由指定数组支持的固定大小(可序列化)集合时,请使用此方法。对返回集合的任何更改也将写入原始数组。 java
39 0
|
8月前
|
Java
Arrays.asList()方法 讲解
Arrays.asList()方法 讲解
33 0
|
9月前
|
Java 编译器 索引
深入解析Java中的数组复制:System.arraycopy、Arrays.copyOf和Arrays.copyOfRange
当涉及到在Java中处理数组时,有许多方法可供选择,其中一些包括`System.arraycopy()`、`Arrays.copyOf()`和`Arrays.copyOfRange()`。这些方法允许您在不同的数组之间复制数据,但它们之间有一些细微的差异。在本篇博客文章中,我们将深入探讨这些方法,以便您了解何时使用它们以及如何正确使用它们。
282 1
|
Java C++ 索引
Arrays.asList() vs Collections.singletonList()
看了 IDEA 的告警: 与 Collections.singletonList 比,使用 Arrays.asList 来生成一个list是否更有优势?后者还能使得返回的list不可变。
116 0
|
Java API
Arrays.asList注意事项
Arrays.asList注意事项
|
C++ 存储 Java
Arrays.copyOf()与System.arraycopy()的区别
Arrays.copyOf()与System.arraycopy()的区别
150 0
Arrays.copyOf()与System.arraycopy()的区别
|
安全 Java API
Arrays.asList 解析
快速学习方法的定义 | 学习笔记
84 0