今天,简单讲讲
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()的使用就讲完了。
就这么简单。