Android 成长笔记

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 输出
上一篇下一篇

猜你喜欢

热点阅读