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

标签 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 一样的三字母代码

最佳答案

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

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

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

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

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

关于java - String 和 HashSet 之间用于检查重复项的最佳(性能 + 内存)是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16957235/

相关文章:

c# - 找出两个字符串是否模糊的最快方法是什么? [不是另一个 Levenshtein 帖子]

ios - Monotouch-启用Guard Malloc

java - 如何一起使用 LibGDX、Gradle、Git 和 Eclipse?

java - 根据音高、速度和速率应用声音效果

php - 使用类时查询速度慢

linux - 如何以原子方式更新 Docker 实例之间共享的计数器

c++ - 用 new int[10] 分配的内存必须用 delete[] 释放

cocoa - 了解 mac os 中的 vm_stat,如何将这些数字转换为类似于事件监视器的数字?

java - 通过 ezjcom 在 swing 中运行 flash swf 时缺少 dll

java - SpringBoot : How to call a API chain using reactive programming?