我已经看过代码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]
答案 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()