千万不要这样使用Arrays.asList !
测试的几种情况及原因:
public static void main(String[] args) {
//第一种基本类型数组 int[] arr = {1,2,3,4}; List list = Arrays.asList(arr); System.out.println(list.size()); //1 // 由于Arrays.ArrayList参数为可变长泛型,而基本类型是无法泛型化的, // 所以它把int[] arr数组当成了一个泛型对象,所以集合中最终只有一个元素arr。 for (int i=0;i<list.size();i++){ System.out.println(i+list.get(i).toString()); }//0[I@1134affc
//第二种字符串数组修改 String[] strArr = {"sha","diao","nv","hai"}; List list2 = Arrays.asList(strArr); strArr[1]="cha"; list2.set(2, "nan"); System.out.println(strArr[1].hashCode()); //98460 System.out.println(list2.get(1).hashCode());//98460 // 由于asList产生的集合元素是直接引用作为参数的数组, // 所以当外部数组或集合改变时,数组和集合会同步变化,这在平时我们编码时可能产生莫名的问题。 System.out.println(Arrays.toString(strArr));//[sha, cha, nan, hai] System.out.println(list2.toString());//[sha, cha, nan, hai]
//第三种list增加、删除操作 String[] strArr1 = {"sha","diao","nv","hai"}; List list1 = Arrays.asList(strArr1); //返回的是Arrays的内部类Arraylist,并不是java.util报里面的, // 这个Arraylist实现了AbstractList但是并没有重载add和remove方法 //AbstractList像一个适配器是直接抛异常的 list1.add("zi"); //UnsupportedOperationException异常 list1.remove("sha"); list1.remove("diao"); System.out.println(list1.toString()); }
Arrays.asList()源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public static <T> List<T> asList(T... a) { return new ArrayList<>(a); } 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); } ...} |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix