M. *_* Wu 4 java string performance jvm arraylist
在做LeetCode 125时,我采用了一种简单的算法:
修剪后的字符串存储为String或ArrayList.但是,遍历修剪后的字符串(存储为String)会导致"Time Exceeded",同时接受遍历ArrayList.由于除了String/ArrayList之外,两段代码完全相同,我想在Java处理String而不是ArrayList时可能要慢得多.
谁能告诉我差异来自哪里?
代码1(按字符串):
public class Solution {
public boolean isPalindrome(String s) {
s = s.toLowerCase();
String trimmed = "";
for (int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
if (ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9') {
trimmed = trimmed + ch;
}
}
for (int i=0; i<(trimmed.length()+1)/2; i++) {
if (trimmed.charAt(i) != trimed.charAt(trimmed.length() -1 -i)) {
return false;
}
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
代码2,(由ArrayList):
public class Solution {
public boolean isPalindrome(String s) {
s = s.toLowerCase();
List<Character> trimmed = new ArrayList<Character>();
for (int i=0; i<s.length(); i++) {
char ch = s.charAt(i);
if (ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9') {
trimmed.add(ch);
}
}
for (int i=0; i<(trimmed.size())/2; i++) {
if (trimmed.get(i) != trimmed.get(trimmed.size() - 1 -i)) {
return false;
}
}
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
它在这里:
trimmed = trimmed + ch;
Run Code Online (Sandbox Code Playgroud)
字符串连接并不便宜,因此每次执行此操作时都会创建一个新的String并复制一个内部数组.在ArrayList示例中,当您编写:
trimmed.add(ch);
Run Code Online (Sandbox Code Playgroud)
你不是每次都创建一个新的数组.StringBuilder如果您想要字符串的类似性能,请使用:
StringBuilder trimmed = new StringBuilder();
...
trimmed.append(ch)
Run Code Online (Sandbox Code Playgroud)
对于您的情况,您可以考虑使用现有replace方法替换所有空格:
String trimmed = s.replace(" ", "");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
63 次 |
| 最近记录: |