为什么使用数组而不是字符串可以减少内存消耗和执行时间?

给定 char 数组形式的字符串。将其修改为所有感叹号符号“!” 被转移到数组的开头,并且所有 ohters 的顺序相同。请编写一个带有单个 char[] 类型参数的方法。关注算法的内存和时间消耗。


我收到的反馈:可以使用数组而不是字符串。我在哪里可以找到有关内存的信息?


public static String formatString(char[] chars) {

    StringBuilder exclamationSymbols = new StringBuilder();

    StringBuilder otherSymbols = new StringBuilder();


    for (char c : chars) {

        if (c == '!') {

            exclamationSymbols.append(c);

        } else {

            otherSymbols.append(c);

        }

    }


    return (exclamationSymbols.toString() + otherSymbols.toString());

}


慕神8447489
浏览 155回答 1
1回答

繁星淼淼

您可以使用 achar[]比使用 a 更快地执行此操作,StringBuilder因为:aStringBuilder只是 a 的包装器char[],所以它不可能更快。间接意味着它会更慢。您确切地知道结果将持续多长时间,因此您可以分配char[]您需要的最小尺寸。使用 a&nbsp;StringBuilder,您可以预先确定它的大小,但是使用两个StringBuilders 则不能完全确定大小,因此您要么必须过度分配长度(例如,使两者的长度都与 相同chars),要么依靠StringBuilder内部调整自身大小(这会更慢比不;它使用更多的内存)。我的想法是使用两个整数指针指向您将在字符串中写入 char 的下一个位置:一个从数组的开头开始,另一个从末尾开始;当您通过输入进行操作时,两个指针将靠得更近。处理完整个输入后,结果数组中与“结束指针”对应的部分将向后,因此将其反转。你可以这样做:char[] newChars = new char[chars.length];int left = 0;int right = chars.length;for (char c : chars) {&nbsp; if (c == '!') {&nbsp; &nbsp; newChars[left++] = c;&nbsp; } else {&nbsp; &nbsp; newChars[--right] = c;&nbsp; }}// Reverse the "otherSymbols".for (int i = right, j = newChars.length - 1; i < j; ++i, --j) {&nbsp; char tmp = newChars[i];&nbsp; newChars[i] = newChars[j];&nbsp; newChars[j] = tmp;}return new String(newChars);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java