如果我更改传递给Arrays.asList(array)的数组,列表值会更改

时间:2018-05-20 15:33:27

标签: java arrays

我已经看过代码Arrays.class,但是无法理解为什么对数组所做的更改会反映到ArrayList,即使下面的代码返回了新的ArrayList。

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

示例代码:

    public class Test {
    public static void main(String[] args) {
        Integer [] array = {1,2,3,4,5};
        List<Integer> list = new ArrayList<>();
        list = Arrays.asList(array);
        System.out.println("List created from array:  " + list);
        array[0] = 100;
        System.out.println("List after changing array:" + list);
    }
}

输出:

从数组创建的列表:[1,2,3,4,5]

更改数组后的列表:[100,2,3,4,5]

1 个答案:

答案 0 :(得分:8)

该列表由关于Arrays.asList()的文档中指定的数组支持:

  

返回由指定数组支持的固定大小的列表。 (改为   返回的列表&#34;通过&#34;到阵列。)

如果你挖掘线<form action="" method="POST" id="myForm"> <fieldset> <input type="text" name="fullname" placeholder="Full Name" /> <br /> <input type="text" name="subject" placeholder="Subject" /> <br /> <input type="text" name="phone" placeholder="Phone" /> <br /> <input type="text" name="emailid" placeholder="Email" /> <br /> <textarea rows="4" cols="20" name="comments" placeholder="Comments"></textarea> <br /> <input type="button" name=" onclick=" myFunction() " value="Submit form"> </fieldset> </form> (...) <script> function myFunction() { document.getElementById("myForm").submit(); } </script> ,你会看到:

return new ArrayList<>(a)

正如您所看到的,列表不会复制数组数据,只需将其引用分配给其内部数组。

因此,您对原始数组的更改会反映到列表中,反之亦然

请注意:private final E[] a; // This is internal array of List ArrayList(E[] array) { a = Objects.requireNonNull(array); } public static <T> T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; // Just return the array reference. No deep copy } 会返回Arrays.asList()的实例:

Arrays.ArrayList<>

private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable { } 不同,java.util.ArrayList返回的List未实现所有List函数。如果您尝试使用Arrays.asList等方法,则会抛出add()