众所周知,如果你改变了一个对象,那么每个人都会在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;只有所有对象中的对象在所有数组中更新,但引用的数组保持未排序?
答案 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()])));
感谢。