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