做一个List<>更改时更改所有其他对LIst<&gt ;?的引用

时间:2014-10-14 13:23:28

标签: java list reference

众所周知,如果你改变了一个对象,那么每个人都会在Java中知道。对该对象的引用也会发生变化,如下例所示。

List<String> mainList = new ArrayList<String>(); 
mainList.add("a");
mainList.add("c");
mainList.add("b");
mainList.add("d");

System.out.println(Arrays.toString(mainList.toArray(new String[mainList.size()]))); // randomly ordered strings [a, c, b, d]

List<String> referencedList = mainList;// referencedList contains the same unordered strings [a, c, b, d]

Collections.sort(mainList);// mainList is sorted [a, b, c, d]
System.out.println(Arrays.toString(referencedList.toArray(new String[ referencedList.size()]))); // the referenced list is also sorted

有没有办法获得List&lt;&gt;只有所有对象中的对象在所有数组中更新,但引用的数组保持未排序?

3 个答案:

答案 0 :(得分:2)

听起来你只想要一个浅层克隆,例如

List<String> referencedStrings = new ArrayList<>(referencedStrings);

这将获取现有列表的副本 - 但由于列表仅包含引用,因此对这些引用所引用的对象的任何更改都将通过两个列表可见。 (不过你不能改变String个对象的内容,请注意......)

答案 1 :(得分:0)

您的代码存在的问题是referencedList保持与mainList相同的引用。 关键是要创建mainList内容的副本。

您可以遍历mainList,如

List<String> referencedList = new ArrayList<String>();
for(String s: mainList){
    referenced.add(s);
}
//sort mainList

两个列表都将保留相同的引用,但mainList已排序。

或者像Jon Skeet所指出的那样使用ArrayList(List list)构造函数。

现在您可以对mainList进行排序,因为它只会更改列表本身,而不会更改其内容。

答案 2 :(得分:0)

无需对列表元素进行排序。现在,下面的代码显示了主列表的元素和顺序。

List<String> mainList = new ArrayList<String>();
mainList.add("a");
mainList.add("c");
mainList.add("b");
mainList.add("d");

// randomly ordered strings [a, c, b, d]
System.out.println(Arrays.toString(mainList.toArray(new String[mainList.size()])));
// referencedList contains the same unordered strings [a, c, b, d]
List<String> referencedList = mainList;
// the referenced list is also sorted
System.out.println(Arrays.toString(referencedList.toArray(new String[ referencedList.size()])));

感谢。