android Collections.addAll()的使用。
我们在编码时经常需要将一些元素添加到一个List中,此时我们一般有两种选择:Collections.addAll()或者是ArrayList.addAll()。在需添加元素比较少的情况下,并在List的size在万级以上时,一般建议Collections.addAll(),但当List的size较小时,两种方法没有什么区别,甚至ArrayList.addAll()更好。
当我们将一个数组添加到一个List中时,Collections.addAll()和ArrayList.addAll()没有什么性能差异。
但当我们将一个List添加到一个List中时,建议使用ArrayList.addAll()。
添加数组和列表,要比添加元素快。
HashMap和HashSet有类似用法。
下面简单介绍Collections.addAll()的使用代码
public class CollectionsTest { public static void main(String[] args) { List<String> l = new ArrayList<String>(); CollectionsTest.add(l); String[] s = {"s1","s2"}; Collections.addAll(l, s); Collections.addAll(l, "a1","a2"); UtilTools.printCollection(l); } public static void add(Collection<String> c){ for(char i='a';i<'g';i++){ c.add(String.valueOf(i)); } } }
这里需要注意一点,使用Collections.addAll还是Arrays.asList生成List,当修改原始数据时,均会影响到List里的数据 。
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里的数据
android Collections.addAll()的使用就讲完了。
就这么简单。