2

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

4 回答 4

7

方法2要好得多。你甚至不应该考虑方法1。

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

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

第三(不是性能问题):像这样混合数据(aCode)和元数据(分隔符-)会导致各种不良影响。您可能确定now aCode永远不会包含破折号,但如果两周后发生变化怎么办?

第四:几乎正是为这个用例HashSet构建的!这就是它最擅长的:持有一组不同的对象,检查它是否已经存在并添加一个新对象。

于 2013-06-06T08:35:37.180 回答
1

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

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

于 2013-06-06T08:36:52.717 回答
0

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

于 2013-06-06T08:34:45.187 回答
0

性能和内存方面的 Hashset 比 String 更适合用于您的编码。

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

于 2013-06-06T08:47:22.420 回答