什么更有效" ||"还是循环?

时间:2014-07-02 16:23:31

标签: java if-statement for-loop performance

让我们说你必须编辑arraylist中的一系列单词(" cat"," dog"," catdog"," mandog& #34)

现在你可以把它放到像这样的for循环中

 for(int i=0; i<arraylist.size(); i++){
    if(arraylist.get(i).matches("cat") || arraylist.get(i).matches("dog") etc.. etc..
      {
        //do something
      }
   }

或者你可以将单词(cat,dog,catdog和mandog)放入字符串数组/ arraylist中并使用它进行比较。

哪一个更有效率?

考虑到单词列表可能非常大。

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

两者都没有,性能差异可以忽略不计,它们在关键字列表的大小上都是线性的。

考虑到单词列表可能会变得很大,您应该使用SetHashSet可以在固定时间内执行contains检查,使其非常适合此目的。所以:

Set<String> keywords = new HashSet<>();

keywords.add("cat");
keywords.add("dog");
// ...

for (String element: arraylist) {
    if (keywords.contains(element)) {
        // Do something
    }
}

请注意,使用matches实际上与使用equals相同,因此我们只需测试相等性。

答案 1 :(得分:1)

我认为适当的方式(虽然有更多工作)是测试所有选项。使用分析器查看代码执行查找所花费的时间,然后使用产生最佳结果的过程。

如果不使用分析器,很难确定性能方面的改进。

答案 2 :(得分:0)

由于您在代码中使用matches()方法,我假设您需要对正则表达式进行匹配。如果是这种情况,您可以选择嵌套的for循环。

String[] patterns = {"cat", "dog"};
for(String item : arraylist){
    for(String pattern : patterns){
        if(item.matches(pattern)){
            //do something
        }
    }
}

如果您只是想检查列表中是否存在字符串,您可以使用Stefano Sanfilippo方法。