如何做到这一点?
我尝试创建一个新的空列表,然后将不可修改的列表元素复制到它,但是我得到了不支持的操作错误。
感谢任何帮助。
答案 0 :(得分:39)
FWIW,google-collections这是一个单行:
List<Foo> sorted = Ordering.natural().sortedCopy(unmodifiableList);
答案 1 :(得分:35)
List unmodifiableList = Collections.unmodifiableList(list);
List newList = new ArrayList(unmodifiableList);
Collections.sort(newList);
ArrayList
的构造函数接受现有列表,读取其元素(不修改它们!),并将它们添加到新列表中。
答案 2 :(得分:21)
您是否使用Collections.emptyList()
创建空列表?如果是这样,那也是一个不可修改的列表,这可能是你问题的根源。
使用List实现的构造函数创建新列表,例如new ArrayList()
。您可以将原始列表传递给构造函数,也可以使用addAll()
方法。
答案 3 :(得分:12)
在Java 8中,您可以使用流API。例如:
List<?> sortedList = unsortedList.stream().sorted().collect(Collectors.toList());
答案 4 :(得分:0)
它应该如所描述的那样工作。不可修改列表中的元素本身不可修改。当然,您无法对不可修改的List进行排序,因为它必须使用添加和删除操作进行重写,并且不允许这样做。
猜错误是在其他地方,最好是显示你的代码:)
答案 5 :(得分:0)
我会回答你的第二个问题:
您无法添加到'taskListModifiable'列表中,因为这是一个'不可修改的'列表,在Java中表示它是不可变的。不能以任何方式直接更改不可修改/不可变的列表或任何类型的集合 - 您不能向其添加元素,从中删除元素或更改对现有元素的引用。
请注意,如果列表/集合中的现有元素本身是可变的,则可能会更改这些元素,但无法更改列表/集合中对它们的引用。也就是说,在列表完全超出范围并进行垃圾回收之前,不可修改的列表将始终包含相同的引用。
现在,在您的情况下,Collections.emptyList()返回一个不可修改的 EMPTY 列表。这实际上总是相同的实例,因为它是不可变的并且总是空的。由于无法扩展(添加到)不可变列表的规则,您无法添加它。由于它是空的,因此也没有任何东西可以改变。
我应该添加以使得更清楚的是Collection.emptyList()不会创建一个空列表。它只返回对单例列表实例的引用。