For Loop表现缓慢

时间:2014-04-05 08:30:09

标签: java string performance for-loop substring

请查看以下代码

//Devide the has into set of 3 pieces
    private void devideHash(String str)
    {
        int lastIndex = 0;

        for(int i=0;i<=str.length();i=i+3)
            {
                lastIndex = i;
                try
                {
                    String stringPiece = str.substring(i, i+3);
                  //  pw.println(stringPiece);
                    hashSet.add(stringPiece);
                }
                catch(Exception arr)
                {
                    String stringPiece = str.substring(lastIndex, str.length());
                  //  pw.println(stringPiece);
                    hashSet.add(stringPiece);
                }
            }
    }

上述方法接收类似abcdefgjijklmnop的字符串作为参数。在方法内部,它的工作是划分这3组字母。因此,当操作完成后,hashset将包含abc def ghi jkl mno p

但问题是如果输入String很大,那么这个循环需要相当长的时间才能完成。有什么方法可以用来加速这个过程吗?

2 个答案:

答案 0 :(得分:4)

作为一个选项,您可以用以下代码替换所有代码:

private void divideHash(String str) {
    hashSet.addAll(Arrays.asList(str.split("(?<=\\G...)")));
}

哪个表现不错。


这是一些测试代码:

String str = "abcdefghijklmnop";
hashSet.addAll(Arrays.asList(str.split("(?<=\\G...)")));
System.out.println(hashSet);

输出:

[jkl, abc, ghi, def, mno, p]

答案 1 :(得分:2)

除非你告诉我们什么是显着的大量&#34;否则我们无法告诉你什么。是的,预计的时间是多久。建议您启动一个分析器来查找逻辑占用最多的时间。

我可以通过简要阅读您的代码给出一些建议:

  1. 如果结果集很大,当你的HashSet调整大小时,它将涉及大量调整大小和重新散列。建议您先分配所需的大小。例如

    HashSet hashSet = new HashSet<String>(input.size() / 3 + 1, 1.0);

    这将为您节省大量时间进行不必要的重组

  2. 切勿使用异常来控制程序流程。

  3. 为什么不简单地做:

    int i = 0;
    for (int i = 0; i < input.size(); i += 3) {
        if (i + 3 > input.size()) {
            // substring from i to end
        } else {
            // subtring from i to i+3
        }
    }