4

当我阅读java源代码时,我发现在collection界面中,会是安全的

返回的数组将是“安全的”,因为此集合不维护对它的引用。(换句话说,即使此集合由数组支持,此方法也必须分配一个新数组)。因此调用者可以自由修改返回的数组。

没看懂意思,能举个例子吗?

4

2 回答 2

14

当然:

List<String> list = Arrays.asList("foo", "bar", "baz");
String[] array = list.toArray(new String[0]);
array[0] = "qux";
System.out.println(list.get(0));  // still "foo"
于 2013-09-05T14:21:16.403 回答
0

这个“安全”并不是“绝对安全”。

如果修改元素的字段,列表将随着返回的数组而改变toArray()。但是如果你将它指向另一个引用,列表将不会随着数组而改变。

原因是它toArray()返回一个包含对象内存地址的数组。

更改元素的内容

ArrayList<Student> a = new ArrayList<>();
a.add(new Student("Sarah",17));
Student[] s = a.toArray(new Student[0]);
s[0].setName("Lily");
System.out.println(a.get(0)==s[0]);//true

更改参考

这是源代码注释的“安全”。

ArrayList<Student> a = new ArrayList<>();
a.add(new Student("Sarah",17));
Student[] s = a.toArray(new Student[0]);
s[0]=new Student("Lily",20);
System.out.println(a.get(0)==s[0]);//false

于 2020-09-28T11:06:25.183 回答