簡體   English   中英

Java中ContainsAll的成本是多少?

[英]What is the cost of ContainsAll in Java?

我今天在一些編碼中發現了containsAll() (一種List接口方法),它看起來很漂亮。 有誰知道在性能/迭代方面要花多少錢?

文檔在這方面沒有提供太多幫助。

  • 首先,迭代提供的集合的每個元素
  • 然后迭代列表中的所有元素,並使用.equals(..)將當前元素與它們進行比較(注意:正如您在問題中所指定的,這是關於列表的。其他集合的行為有所不同)

因此它是O(n * m),其中n和m是兩個集合的大小。

public boolean containsAll(Collection<?> c) {
    Iterator<?> e = c.iterator();
    while (e.hasNext())
        if (!contains(e.next()))
        return false;
    return true;
}

使用源盧克:)

編輯:正如Bozho所指出的,您正在詢問List.containsAll() ,它重寫了Collection.containsAll() 以下是有關后者的主要討論:

大多數Collection類將使用AbstractCollectioncontainsAll實現 ,其實現方式如下:

public boolean containsAll(Collection<?> c) {
    for (Object e : c)
        if (!contains(e))
            return false;
    return true;
}

但是,不能保證某些實現會完全不同地執行它-這可能導致更好或更壞的運行時行為。

上述實施containsAll將至少O(n),其中n是項目的數量Collection你傳遞參數再加上任何時間contains需要:

  • 對於HashSet / HashMap它可能是O(1)(最好的情況下,沒有沖突),因此containsAll的整體運行時間仍然是O(n)
  • 對於ArrayListcontains將采用O(m),其中m是列表中的數字項(不是參數),所以containsAll的總時間為O(n * m)

如果您正在呼叫A.containsAll(B)

openjdk迭代B的所有調用A.contains(b)的元素。

A.contains(b)迭代A的所有元素,調用a.equals(b)

這是從開源jdk 7獲取的

考慮

n。包含全部(m)

最好的情況是O(m),即n是一個完美的哈希集。

考慮到未排序的列表,我可以提出O(n * log(n)+ m * log(m))算法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM