[英]What it is the best performance way to grab duplicates from a large Set<String>?
[英]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.