使用Collections.addAll还是Arrays.asList生成List,当修改原始数据时,均会影响到List里的数据
2016-01-06 17:45
525 查看
感谢作者能翻译并且分享这么优质的文章。不过文章中有一处表述欠妥:
从字面上理解,作者的意思应该是指避免上述的两个坑,
欠妥的主要是后者:修改原数据,list中的值也会变
环境:
Collections.addAll方法的源码如下所示:
Arrays.asList方法相关源码如下所示:
从源码来看,不管是Collections.addAll,还是Arrays.asList,均是引用传递,修改source object会影响到list里的target object。下面是我测试的代码:
运行结果
结论,不管是Collections.addAll还是Arrays.asList,修改原始数据时,均会影响到List里的数据
原帖地址
如果希望避免这两个坑,请改用这个方式 Collections.addAll(arraylist, array);
从字面上理解,作者的意思应该是指避免上述的两个坑,
定长&&
修改原数据会影响list里的对象。
欠妥的主要是后者:修改原数据,list中的值也会变
环境:
java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b18) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
Collections.addAll方法的源码如下所示:
@SafeVarargs public static <T> boolean addAll(Collection<? super T> c, T... elements) { boolean result = false; for (T element : elements) result |= c.add(element); return result; }
Arrays.asList方法相关源码如下所示:
@SafeVarargs @SuppressWarnings("varargs") public static <T> List<T> asList(T... a) { return new ArrayList<>(a);// 内部私有类 } ArrayList(E[] array) { a = Objects.requireNonNull(array); } public static <T> T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; }
从源码来看,不管是Collections.addAll,还是Arrays.asList,均是引用传递,修改source object会影响到list里的target object。下面是我测试的代码:
public static void main(String[] args) { User user_1 = new User(); user_1.put("name", "user_1"); user_1.put("value", "v_1"); User user_2 = new User(); user_2.put("name", "user_2"); user_2.put("value", "v_2"); List<User> asList = Arrays.asList(user_1, user_2); List<User> arraylist = new ArrayList<>(); Collections.addAll(arraylist, user_1, user_2); user_1.put("value", "v_a_1"); user_2.put("value", "v_a_2"); System.out.println("-------- asList --------"); System.out.println(JsonKit.toJson(asList)); System.out.println("\n-------- arraylist --------"); System.out.println(JsonKit.toJson(arraylist)); }
运行结果
-------- asList -------- [{"name":"user_1","value":"v_a_1"},{"name":"user_2","value":"v_a_2"}] -------- arraylist -------- [{"name":"user_1","value":"v_a_1"},{"name":"user_2","value":"v_a_2"}]
结论,不管是Collections.addAll还是Arrays.asList,修改原始数据时,均会影响到List里的数据
原帖地址
相关文章推荐
- 浅谈JAVASE单例设计模式
- java IO总结
- 从JavaSE开始到Android开发
- Java中字节与十六进制的转换
- 正则表达式-常用构造子列表
- Java问题系列:内存回收
- 2014134027谢天
- 2014134027谢天
- 谢天2014134027课程实验报告
- 2014134027 谢天
- JavaSE:Day01-Java概述
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
- 黑马程序员 JAVASE——异常及异常的处理机制
- 黑马程序员 JAVASE——String
- 黑马程序员 JAVA提高——反射
- 黑马程序员 java提高——张孝详交通灯管理系统
- 黑马程序员 java提高——张孝祥银行业务调度系统
- new一个Object对象占用多少内存?
- java就是这样一个东西