我想知道Collections.unmodifiableList
的时间复杂度是多少?
如果我想让传入的Collection
不可变,那么最便宜的方式是什么?
答案 0 :(得分:9)
我想知道
Collections.unmodifiableList
的时间复杂度是什么?
Collections.unmodifiableList
返回其参数列表的视图而不是副本,因此它是O(1)。这通常是您创建不可变列表的方式,但请确保不要更改原始可变列表,因为这些更改将反映在新创建的不可变列表中。如果您将原始列表保密,这应该不是问题。这就是我所说的情况:
List<String> modifiableList = new ArrayList<>();
List<String> unmodifiableList = Collections.unmodifiableList(modifiableList);
System.out.println(unmodifiableList);
modifiableList.add("hello");
System.out.println(unmodifiableList);
[] [hello]
这是因为unmodifiableList
是modifiableList
的视图(而不是副本)。
答案 1 :(得分:1)
哪些操作的时间复杂度?
对于所有非修改操作,它将与基础数据结构具有相同的O表示法。
对于所有修改操作,它可能会稍微快一点(早期错误退出)。
答案 2 :(得分:1)
Collections.unmodifiableList
是使Collection<>
不可变的好方法。它还返回一个不可修改的包装器;它不会复制输入列表的内容。
因此,它不会减慢过程,也不会对大型物体有效。
答案 3 :(得分:0)
Collections.unmodifiableList是不可变的最便宜的方法。
它只返回一个包装列表实现。
它不会复制列表。
他们覆盖以下方法。
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
public E remove(int index) {
throw new UnsupportedOperationException();
}
因此,如果任何人尝试添加/删除它将引发异常。
他们覆盖下面的get方法
public E get(int index) {return list.get(index);}
所以它只是委托实际的列表来获取。
但它有一个缺点。
List unmodifiable= Collections.unmodifiableList(list);
unmodifiable.remove(0);
它抛出异常。
如果您更改原始列表,它也会以不可修改的方式反映出来。
list.remove(0);
它也会反映出不可修改的清单。