2011-08-10 10 views
10

Jaka byłaby różnica między implementacją zastąpienia Java w wersji 1.3.2 a implementacją Apache 2.3? Czy występuje wzrost wydajności jeden nad drugim?Implementacja Apache StringUtils vs Java replace()

Java 1.4.2 replace

Apache 2.3 replace

+0

Czy istnieje konkretny powód pytasz o starej wersji Java? –

+0

Cześć, Jochim, im utknęłam w starej wersji Java, którą muszę utrzymywać. :( –

+0

Zwróć uwagę, że 'String.replace (CharSequence, CharSequence)' używa wewnętrznie regexp. :(Zobacz http://stackoverflow.com/questions/16228992/commons-lang-stringutils-replace-performance-vs-string-replace – Vadzim

Odpowiedz

17

Metoda, z którą się łączysz, ma dwie wartości: char, więc zastępuje ją tylko inną (prawdopodobnie kilka razy, mimo to).

Z drugiej strony metoda StringUtils.replace() przyjmuje wartości String jako ciąg wyszukiwania i zastępowania, dzięki czemu może zastąpić dłuższe podciągi.

Porównywalną metodą w Javie będzie replaceAll(). replaceAll() prawdopodobnie będzie wolniejszy niż metoda StringUtils, ponieważ obsługuje wyrażenia regularne, a zatem wprowadza narzut związany ze skompilowaniem ciągu wyszukiwania i uruchomieniem wyszukiwania regex.

Zauważ, że Java 5 wprowadzone String.replace(CharSequence, CharSequence) który robi to samo co StringUtils.replace(String,String) (oprócz tego, że rzuca NullPointerException jeśli którykolwiek z jego argumenty są null). Zauważ, że CharSequence jest interfejsem zaimplementowanym przez String, więc możesz używać tutaj zwykłych starych obiektów String.

+2

+1 dla wskazania, że ​​java.lang.String.replaceAll (...) używa regex i działa wolno.Algorytm używany przez StringUtils.replace (...) jest o wiele lepszy i przewyższa replaceAll() –

+0

@JoachimSauer, odpowiedź na http://stackoverflow.com/a/4874768/910201 wymienia '.replaceEach()', ale skąd pochodzi? Nie mam dostępu do takiej metody i próbowałem zaimportować 'org.springframework. util.StringUtils', 'org.apache.soap.util.StringUtils',' org.apache.axis.utils.StringUtils' oraz 'com.ibm.wsdl.util.StringUtils'. – Xonatron

+0

@MatthewDoucette: odpowiedź jest w komentarze do odpowiedzi, do których się przyłączyłeś: Apache Commons-Lang 'StringUtils' od wersji 2.4. –

2

1.4.2 zastępuje działa tylko z char argumentów podczas gdy Apache 2.3 weźmie w ciągi.

0

Apache's jest trochę szybszy, o ile dobrze pamiętam. Zalecana.

+0

jak to jest faste? r? Czy masz analizę porównawczą lub algorytmiczną? – Bozho

+0

Użyłem go w projekcie po wykonaniu testów, tak. Już ich nie mam. Myśląc o tym, gdyby nie było lepiej, dlaczego mieliby to rozwinąć? Kto zamierza dodać wolniejszą opcję 'replace()' do projektu String Utils? :-) – Brian

+1

w 1.4.2 nie było 'String.replace (ciąg, ciąg)'. Tak było potrzebne w commons. Następnie dodano 1.5. – Bozho

1
  • String.replace(char, char) nie może zastąpić całe ciągi
  • można mieć null wartości z StringUtils.replace(..).

zrobi to samo, jeśli pierwszy ciąg znaków ma wartość -nowy. W przeciwnym razie będzie ona rzucać NullPointerException

+0

Zauważalne, nullable dzięki! –

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; 
    } 
} 

Czas wykonania: podejmowane 6400

Czas: 5888

czasy są prawie takie same!

Mam edytowany kod odpaść kosztów ogólnych replace2 które nie były z powodu realizacji JDK.

0

Aby zastąpić ciąg znaków innym ciągiem przy użyciu StringUtil.Replace, spróbowałem wykonać następujące czynności i działa to dobrze, aby zastąpić wiele wartości ciągu z jednego ciągu.

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

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

Spowoduje to zastąpienie wartości String info z nowo podanej wartości ...