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

nam*_*olk 2 java memory performance

我想做一个简单的实现,根据bigCodeList中包含重复项的不同代码(aCode)做一些操作.下面我提到了两种方法,我想知道的是哪种方法在性能副+内存消耗方面更有效?


方法1:

    String tempStr = "";

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

方法2:

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

        for(String aCode : bigCodeList){

            if(tempHSet.add(aCode)){

                // deal With the aCode related work

            }

        }
Run Code Online (Sandbox Code Playgroud)

注意:aCode是一个像LON一样的三字母代码

Joa*_*uer 7

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

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

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

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

第四:HashSet内置非常正是这种使用案例!这就是它最擅长的:保存一组不同的对象,检查它是否已经存在并添加一个新对象.