簡體   English   中英

用於檢查重復項的String和HashSet之間的最佳(性能+內存)是什么

[英]What is the best (performance + memory) between String and HashSet for checking duplicates

我想做一個簡單的實現,根據bigCodeList中包含重復項的不同代碼(aCode)做一些操作。 下面我提到了兩種方法,我想知道的是哪種方法在性能副+內存消耗方面更有效?


方法1:

    String tempStr = "";

    for(String aCode : bigCodeList){
        if(tempStr.indexOf(aCode) == -1) {
            // deal With the aCode related work
            tempStr += aCode+"-"
        }
    }

方法2:

        HashSet<String> tempHSet = new HashSet<String>();

        for(String aCode : bigCodeList){

            if(tempHSet.add(aCode)){

                // deal With the aCode related work

            }

        }

注意:aCode是一個像LON一樣的三字母代碼

方法2到目前為止更好。 你甚至不應該考慮方法1。

首先,方法1在搜索中具有線性時間。 這意味着當tempStr變長兩倍時,搜索它的時間變長兩倍(當然,平均來說,如果你總是找到第一個元素,它會保持短暫)。

下一步:每次附加時都要復制整個tempStr (因為String對象是不可變的,這是從現有對象創建新對象的唯一方法)。 所以添加選項也需要很長時間。

第三(不是性能問題):像這樣混合數據( aCode )和元數據(分隔符- )會導致各種不良影響。 可能確定現在的 aCode永遠不會包含短划線,但如果在兩周內發生變化會怎么樣?

第四: HashSet內置幾乎正是這種使用情況 這就是它最擅長的:保存一組不同的對象,檢查它是否已經存在並添加一個新對象。

我認為,第一種方法更糟糕: indexOf操作有O(n) ,而對於HashSet復雜性可能是O(1)用於唯一的String鍵查找。

此外,在第一種方法中,您使用的是字符串連接操作,這意味着每次都會創建新的String對象,從而提供額外的性能提取。

java.util.Set不允許重復,但它在拒絕重復方面相當“安靜”。

性能和內存明智的Hashset比在編碼時使用的字符串最好。

將值附加到字符串變量需要時間

暫無
暫無

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

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