2015-05-30 16 views
7

Tôi có nhiều từ cần xử lý và tất cả đều kết thúc bằng ., Tùy chọn nào có độ phức tạp thời gian tốt nhất?Là chuỗi con hoặc thay thế nhanh hơn để xóa ký tự cuối cùng trong chuỗi?

  1. word.substring(0, word.length()-1)

  2. word.replaceAll("\\.","")

  3. word.replace(".", "")

Hoặc là có một cách tốt hơn?

+6

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 đủ. –

+7

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

+1

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. –

Trả lời

11

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ì:

  1. Nó tránh soạn thảo một biểu thức chính quy.
  2. Đó 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.
Các vấn đề liên quan