Java Collections.sort对错误列表进行排序

Java Collections.sort对错误列表进行排序,java,arrays,methods,collections,Java,Arrays,Methods,Collections,我想从我的原始列表中创建一个已排序的列表-而不使用Collections.sort(list)调用更改原始列表。所以我有一个未排序的列表和一个正在排序的列表-从同一个列表中 请看下面的代码: public static void main(String[] args) { ArrayList<Integer> list = new ArrayList(); list.add(5); list.add(8); list.add(3); list.

我想从我的原始列表中创建一个已排序的列表-而不使用
Collections.sort(list)
调用更改原始列表。所以我有一个未排序的列表和一个正在排序的列表-从同一个列表中

请看下面的代码:

public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList();
    list.add(5);
    list.add(8);
    list.add(3);
    list.add(6);
    System.out.println("Before method list is");
    System.out.println(list);
    ArrayList<Integer> theReturnedList = sorted(list);
    System.out.println("After it is");
    System.out.println(list);
}

private static ArrayList<Integer> sorted(ArrayList<Integer> list){
    ArrayList<Integer> returnList = list;
    Collections.sort(returnList);
    return returnList;
}

原始对象保持不变。

您的问题是对引用如何工作的误解。让我们来看看方法:

private static ArrayList<Integer> sorted(ArrayList<Integer> list){
    ArrayList<Integer> returnList = list;
    Collections.sort(returnList);
    return returnList;
}
还有一个方便的
ArrayList
构造函数,它一步完成这一任务:

ArrayList<Integer> returnList = new ArrayList<>(list);
ArrayList returnList=新的ArrayList(列表);

returnList
的更改不会影响
list
,因为它们现在是两个完全独立的列表,恰好包含相同的值。

sorted
方法中,您仍在调用原始列表上的
Collection.sort
。为了避免这种情况,您可以创建一个浅拷贝并返回

private static ArrayList<Integer> sorted(ArrayList<Integer> list){
    ArrayList<Integer> returnList = new ArrayList<>(list);
    Collections.sort(returnList);
    return returnList;
}
已排序的私有静态ArrayList(ArrayList列表){
ArrayList returnList=新的ArrayList(列表);
集合。排序(返回列表);
退货清单;
}
在这一行:

ArrayList<Integer> returnList = list;
这次我们使用原始列表的元素创建另一个ArrayList对象。这样,在对较新的列表进行排序时,原始列表不会更改

这种行为不适用于字符串或LocalDateTime。它们在创建后无法更改其状态,而是返回一个新的副本并应用更改。

您可以使用流api

List<Integer> list = Arrays.asList(5,8,3,6);

List<Integer> newList = list.stream().sorted().collect(Collectors.toList());
List-List=Arrays.asList(5,8,3,6);
List newList=List.stream().sorted().collect(Collectors.toList());

流api提供了几种方法来永久地处理集合。如果您使用的是Java 8或更高版本,这是推荐的方法。

您认为
ArrayList returnList=list
Do?你了解引用类型是如何工作的吗?@lelelo:除非通过反射,
String
s是不可变的——所有会修改字符串的内容都会返回一个包含修改内容的新字符串。所以你永远不会有一个点,一个字符串可以修改,另一个字符串不能修改,因为它们一开始都不能修改。@lelelo阅读进一步的解释。是的,这很有效。为什么我不必用字符串来做呢?字符串方法在Java中是不可变的。你知道哪里有所有不可变对象的完整列表吗?知道这一点很好。这里有一个问题:还有另一个不可变对象列表。还必须包括的类别。
ArrayList<Integer> returnList = list;
private static ArrayList<Integer> sorted(ArrayList<Integer> list){
    ArrayList<Integer> returnList = new ArrayList<>(list); // the new keyword creates a new object on the memory heap
    Collections.sort(returnList);
    return returnList;
}
List<Integer> list = Arrays.asList(5,8,3,6);

List<Integer> newList = list.stream().sorted().collect(Collectors.toList());