簡體   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