2011-08-10 16 views
10

Sự khác nhau giữa việc triển khai thay thế Java 1.4.2 và triển khai Apache 2.3 là gì? Có hiệu suất đạt được cái khác?Apache StringUtils và Java thực hiện thay thế()

Java 1.4.2 replace

Apache 2.3 replace

+0

Có một lý do cụ thể mà bạn đang hỏi về một phiên bản Java cổ xưa? –

+0

Hi Jochim, im mắc kẹt với một phiên bản Java cổ tôi phải duy trì. :( –

+0

Lưu ý rằng 'String.replace (CharSequence, CharSequence)' sử dụng regexp nội bộ.: (Xem http://stackoverflow.com/questions/16228992/commons-lang-stringutils-replace-performance-vs-string-replace – Vadzim

Trả lời

17

Phương pháp String.replace() bạn đã liên kết để nhận hai giá trị char, do đó, nó chỉ thay thế trên ký tự với một giá trị khác (có thể nhiều lần, 'mặc dù).

Phương pháp StringUtils.replace() mặt khác mất String giá trị làm chuỗi tìm kiếm và thay thế, do đó, nó có thể thay thế các bản chất dài hơn.

Phương pháp so sánh trong Java sẽ là replaceAll(). replaceAll() có thể chậm hơn phương pháp StringUtils, bởi vì nó hỗ trợ cụm từ thông dụng và do đó giới thiệu chi phí của việc biên dịch chuỗi tìm kiếm trước và chạy tìm kiếm regex.

Lưu ý rằng Java 5 đã giới thiệu String.replace(CharSequence, CharSequence) thực hiện tương tự như StringUtils.replace(String,String) (ngoại trừ việc nó ném một NullPointerException nếu có đối số của nó là null). Lưu ý rằng CharSequence là giao diện được triển khai bởi String, vì vậy bạn có thể sử dụng các đối tượng cũ String đồng bằng ở đây.

+2

1 để chỉ ra rằng java.lang.String.replaceAll (...) sử dụng regex và nó là chậm Thuật toán được sử dụng bởi StringUtils.replace (...) là vượt trội hơn nhiều và tốt hơn thay thếAll() –

+0

@JoachimSauer, câu trả lời tại http://stackoverflow.com/a/4874768/910201 đề cập đến '.replaceEach()', nhưng nó đến từ đâu? Tôi không có quyền truy cập vào phương thức như vậy và tôi đã thử nhập 'org.springframework. util.StringUtils', 'org.apache.soap.util.StringUtils',' org.apache.axis.utils.StringUtils' và 'com.ibm.wsdl.util.StringUtils'. – Xonatron

+0

@MatthewDoucette: câu trả lời nằm trong các nhận xét của câu trả lời bạn đã liên kết đến: Apache Commons-Lang 'StringUtils' kể từ Phiên bản 2.4. –

2

1.4.2 Thay thế hoạt động chỉ với char tranh cãi trong khi Apache 2.3 một mất trong chuỗi.

0

Apache nhanh hơn một chút, nếu tôi nhớ chính xác. Được đề xuất.

+0

r? Bạn có phân tích điểm chuẩn hay thuật toán không? – Bozho

+0

Tôi đã sử dụng nó trong một dự án sau khi đã làm xong điểm chuẩn. Tôi không còn có chúng nữa. Nghĩ về nó, nếu nó không tốt hơn, tại sao họ lại phát triển nó? Ai sẽ thêm một tùy chọn 'replace()' chậm hơn vào dự án String Utils? :-) – Brian

+1

trong 1.4.2 không có một 'String.replace (chuỗi, chuỗi)'. Vì vậy, nó là cần thiết trong commons. Sau đó, 1,5 thêm nó. – Bozho

1
  • String.replace(char, char) không thể thay thế toàn bộ chuỗi
  • bạn có thể có giá trị null với StringUtils.replace(..).

String.replace(CharSequence s1, CharSequence s2) sẽ thực hiện tương tự nếu chuỗi đầu tiên không phải là rỗng. Nếu không nó sẽ ném một NullPointerException

+0

Ghi chú có thể vô hiệu với lời cảm ơn! –

3
public class Compare { 

    public static void main(String[] args) { 
     StringUtils.isAlphanumeric(""); // Overhead of static class initialization for StringUtils 
     String key = "0 abcdefghijklmno" + Character.toString('\n') + Character.toString('\r'); 

     String key1 = replace1(key); 
     String key2 = replace2(key); 
    } 


    private static String replace1(String key) { 
     long start = System.nanoTime(); 
     key = StringUtils.replaceChars(key, ' ', '_'); 
     key = StringUtils.replaceChars(key, '\n', '_'); 
     key = StringUtils.replaceChars(key, '\r', '_'); 
     long end = System.nanoTime() - start; 
     System.out.println("Time taken : " + end); 
     return key; 
    } 

    public static String replace2(String word) { 
     long start = System.nanoTime(); 
     char[] charArr = word.toCharArray(); 

     int length = charArr.length; 
     for (int i = 0; i < length; i++) { 
      if (charArr[i] == ' ' || charArr[i] == '\n' || charArr[i] == '\r') { 
       charArr[i] = '_'; 
      } 
     } 

     String temp = new String(charArr); 
     long end = System.nanoTime() - start; 
     System.out.println("Time taken : " + end); 
     return temp; 
    } 
} 

Thời gian thực hiện: 6400

Thời gian thực hiện: 5888

Times là gần như giống nhau!

Tôi đã chỉnh sửa mã để bỏ tổng chi phí của replace2 không phải do triển khai JDK.

0

Để thay thế một ký tự chuỗi bằng một chuỗi khác bằng cách sử dụng StringUtil.Replace, tôi đã thử làm theo và nó hoạt động tốt để tôi thay thế nhiều giá trị chuỗi từ một chuỗi.

String info = "[$FIRSTNAME$]_[$LASTNAME$]_[$EMAIL$]_[$ADDRESS$]"; 

String replacedString = StringUtil.replace(info, new String[] { "[$FIRSTNAME$]","[$LASTNAME$]","[$EMAIL$]","[$ADDRESS$]" }, new String[] { "XYZ", "ABC" ,"[email protected]" , "ABCD"}); 

này sẽ thay thế các giá trị String thông tin có giá trị mới được cung cấp ...

Các vấn đề liên quan