用于检查重复项的String和HashSet之间的最佳(性能+内存)是什么

时间:2013-06-06 08:29:55

标签: java performance memory

我想做一个简单的实现,根据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

4 个答案:

答案 0 :(得分:7)

方法2到目前为止更好。你甚至不应该考虑方法1.

首先,方法1在搜索中具有线性时间。这意味着当tempStr变长两倍时,搜索它的时间变长两倍(平均来说,当然,如果你总是找到第一个元素,它会保持短暂)。

下一步:每次附加时都会复制整个tempStr(因为String对象是不可变的,这是从现有对象创建新对象的唯一方法)。所以添加选项也需要很长时间。

第三(不是性能问题):混合数据(aCode)和元数据(分隔符-)会导致各种不良影响。您可能确保 now aCode永远不会包含短划线,但如果在两周内发生变化会怎样?

第四:HashSet 这就是它最擅长的:保存一组不同的对象,检查它是否已经存在并添加一个新对象。

答案 1 :(得分:1)

我认为,第一种方法更糟糕:indexOf操作有O(n),而对于HashSet,复杂性可能是O(1)唯一的字符串键查找。

此外,在第一种方法中,您使用的是字符串连接操作,这意味着每次创建新的String对象,从而提供额外的性能提取。

答案 2 :(得分:0)

java.util.Set不允许重复,但它在拒绝重复方面相当“安静”。

答案 3 :(得分:0)

性能和内存明智的Hashset比在编码中使用的字符串最好。

将值附加到字符串变量需要时间