Java- String:java.lang.OutOfMemoryError:Java堆空间

时间:2017-10-02 07:19:49

标签: string stringbuilder

我正在实现小Java类来解决Hackerrank上的字符串问题:

给定字符串,找到其不可简化的形式,考虑一个有效的操作是删除任何一对具有相同值的相邻字母。

例如:

  

“aabcc”在1次手术后将成为“aab”或“bcc”。

但是,我只想提一下围绕此错误的代码块。虽然我能够很好地解决这个问题,但我很想通过使用 StringBuilder()

的更好方法来提高解决方案的时间性能。

但我还没弄清楚为什么 append()在我的 StringBuilder 类中的行为可能导致内存溢出或任何更复杂的错误行为。

以下是代码:

 static String super_reduced_string(String s){
    StringBuilder res = new StringBuilder(); 
    for (int i = 1; i < s.length(); i++){
        if (s.charAt(i-1) == s.charAt(i)){
            /* waste so much memory leak!!! java.lang.OutOfMemoryError: Java heap space
            //s = res.append(s.substring(0, i-1)).append(s.substring(i+1)).toString(); 
            */
            s = s.substring(0, i-1) + s.substring(i+1);
            i = 0; 
        }
    }
    //then check if it's non-empty, print it out
    if (s.length() != 0){
        return s; 
    }
    return "Empty String"; 
}

我评论的部分是上面提到的不良行为。请帮助我理解这个错误,并调试它!它不应该那么难。

1 个答案:

答案 0 :(得分:0)

在分配给s后,只需清除字符串构建器。

s = res.append(s.substring(0, i-1)).append(s.substring(i+1)).toString(); 
res.setLength(0);