繁体   English   中英

Java Collections.unmodifiableList()时间复杂度

[英]Java Collections.unmodifiableList() time complexity

我想知道Collections.unmodifiableList的时间复杂度是多少?

如果我想让传入的Collection不可变,那么最便宜的方法是什么?

我想知道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]

发生这种情况是因为unmodifiableListmodifiableList的视图(而不是副本)。

操作的时间复杂性?

对于所有非修改操作,它将与基础数据结构具有相同的O表示法。

对于所有修改操作,它可能会稍微快一点(早期错误退出)。

Collections.unmodifiableList是使Collection<>不可变的好方法。 它还返回一个不可修改的包装器; 它不会复制输入列表的内容。

因此,它不会减慢过程,也不会对大型对象有效。

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);

它也将反映不可修改的列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM