Java 中如何正确地将一个 List 赋值给另一个 List
2017-10-18 本文已影响72人
赵者也
声明:
ArrayList arrayList;
上面的代码仅仅只是声明了一个 list 变量,其作用相当于 C++ 中的引用变量(一个对象块的索引),但并未为其分配具体的对象所需要的内存空间,其所分配的空间其实仅仅只是 “arrayList” 变量所需空间。
此时就需要对其进行实例化,实例化的过程是为对象分配所需完整的内存空间。此时,对象 “arrayList” 才是该 list 的一个实例,然后将分配的内存地址返回给定义的变量 “arrayList”。
我们可以看一下下面的这段代码:
ArrayList<String> A = new ArrayList<>();
A.add("1");
A.add("2");
ArrayList<String> B = A;
Log.d(TAG, A.toString());
B.add("3");
Log.d(TAG, A.toString());
上面的代码在 Android Studio 中测试的输出为
测试输出此时 B 对象相当于 A 对象的引用,而并不是将 A 对象的值单纯的传递给 B 对象,此时 A 与 B 共享 A 对象。即对B 对象的操作将直接改变 A 对象。如 B.add("3"); 结果 A 中也将包含 “3”;
那么如果我们想把 A 的值赋予对象 B,即同时有 A 和 B 两个对象,方式多种:
方式一:
ArrayList<String> C = new ArrayList<>(A);
方式二:
Object aClone = A.clone();
if (aClone instanceof ArrayList<?>) {
@SuppressWarnings("unchecked")
ArrayList<String> D = (ArrayList<String>) aClone;
}
方式三:
ArrayList<String> E = new ArrayList<>();
E.addAll(A);
方式四:
ArrayList<String> F = new ArrayList<>();
for (String s : A) {
F.add(s);
}
上面四种方式的测试代码如下:
ArrayList<String> A = new ArrayList<>();
A.add("1");
A.add("2");
ArrayList<String> B = A;
Log.d(TAG, "A content: " + A.toString());
B.add("3");
Log.d(TAG, "A content: " + A.toString());
ArrayList<String> C = new ArrayList<>(A);
C.add("4");
Log.d(TAG, "A content: " + A.toString());
Log.d(TAG, "C content: " + C.toString());
Object aClone = A.clone();
if (aClone instanceof ArrayList<?>) {
@SuppressWarnings("unchecked")
ArrayList<String> D = (ArrayList<String>) aClone;
D.add("5");
Log.d(TAG, "A content: " + A.toString());
Log.d(TAG, "D content: " + D.toString());
}
ArrayList<String> E = new ArrayList<>();
E.addAll(A);
E.add("6");
Log.d(TAG, "A content: " + A.toString());
Log.d(TAG, "E content: " + E.toString());
ArrayList<String> F = new ArrayList<>();
for (String s : A) {
F.add(s);
}
F.add("7");
Log.d(TAG, "A content: " + A.toString());
Log.d(TAG, "F content: " + F.toString());
Log 输出:
Log 输出