Một xét nghiệm đơn giản (với JDK1.7.0_75) có thể thấy sự khác biệt:
private static final int LENGTH = 10000;
public static void main(String[] args) {
String[] strings = new String[LENGTH];
for (int i = 0; i < LENGTH; i++) {
strings[i] = "abc" + i + ".";
}
long start = System.currentTimeMillis();
for (int i = 0; i < strings.length; i++) {
String word = strings[i];
word = word.substring(0, word.length()-1);
}
long end = System.currentTimeMillis();
System.out.println("substring: " + (end - start) + " millisec.");
start = System.currentTimeMillis();
for (int i = 0; i < strings.length; i++) {
String word = strings[i];
word = word.replaceAll(".", "");
}
end = System.currentTimeMillis();
System.out.println("replaceAll: " + (end - start) + " millisec.");
start = System.currentTimeMillis();
for (int i = 0; i < strings.length; i++) {
String word = strings[i];
word = word.replace(".", "");
}
end = System.currentTimeMillis();
System.out.println("replace: " + (end - start) + " millisec.");
}
Output:
chuỗi con: 0 millisec.
replaceAll: 78 millisec.
thay thế: 16 millisec.
Đúng như dự đoán, các substring
là nhanh nhất vì:
- Nó tránh soạn thảo một biểu thức chính quy.
- Đó là thời gian không đổi: tạo
String
mới dựa trên chỉ mục bắt đầu và kết thúc được chỉ định.
Trong số _three_, từ đầu tiên là nhanh nhất vì nó là O (1) (bỏ qua các ký tự sao chép mà tất cả các ký tự này thực hiện). Những người khác phải quét chuỗi đầy đủ. –
Lưu ý rằng tùy chọn thứ hai sẽ thay thế mọi thứ trong chuỗi bởi vì 'replaceAll' lấy một * regex * và' .' là ký tự đại diện. – Vulcan
Trong trường hợp đó, bạn nên sử dụng công cụ xử lý văn bản 'StringBuilder' hoặc các công cụ xử lý văn bản khác. –