2011-08-10 11 views
10

Quale sarebbe la differenza tra l'implementazione della sostituzione di Java 1.4.2 e l'implementazione di Apache 2.3? C'è un aumento delle prestazioni uno rispetto all'altro?Apache StringUtils vs implementazione Java di replace()

Java 1.4.2 replace

Apache 2.3 replace

+0

C'è un motivo specifico che stai chiedendo un antico versione di Java? –

+0

Ciao Jochim, mi sono bloccato con un'antica versione di Java che devo mantenere. :( –

+0

Nota che 'String.replace (CharSequence, CharSequence)' usa regexp internamente. :(Vedi http://stackoverflow.com/questions/16228992/commons-lang-stringutils-replace-performance-vs-string-replace – Vadzim

risposta

17

Il metodo String.replace() a cui è stato eseguito il collegamento richiede due valori char, quindi sostituisce sempre e solo il carattere con un altro (probabilmente più volte, "sebbene).

Il metodo StringUtils.replace() d'altra parte assume i valori String come stringa di ricerca e sostituzione, quindi può sostituire sottostringhe più lunghe.

Il metodo analogo in Java è replaceAll(). È probabile che replaceAll() sia più lento del metodo StringUtils, perché supporta le espressioni regolari e quindi introduce il sovraccarico di compilare prima la stringa di ricerca e di eseguire una ricerca regolare.

Nota che Java 5 ha introdotto String.replace(CharSequence, CharSequence) che fa la stessa cosa come StringUtils.replace(String,String) (tranne che getta una NullPointerException se uno dei suoi argomenti sono null). Si noti che CharSequence è un'interfaccia implementata da String, quindi è possibile utilizzare semplici vecchi oggetti String qui.

+2

+1 per indicare che java.lang.String.replaceAll (...) usa regex ed è lento.L'algoritmo usato da StringUtils.replace (...) è di gran lunga superiore e supera outAll() –

+0

@JoachimSauer, il la risposta a http://stackoverflow.com/a/4874768/910201 menziona '.replaceEach()', ma da dove viene? Non ho accesso a tale metodo e ho provato a importare 'org.springframework. util.StringUtils', 'org.apache.soap.util.StringUtils',' org.apache.axis.utils.StringUtils' e 'com.ibm.wsdl.util.StringUtils'. – Xonatron

+0

@MatthewDoucette: la risposta è i commenti della risposta che hai collegato a: Apache Commons-Lang 'StringUtils' dalla versione 2.4 –

2

1.4.2 sostituisce funziona solo con char argomenti mentre l'Apache 2.3 prende in stringhe.

0

Apache è un po 'più veloce, se ricordo male. Consigliato.

+0

come è faste r? Hai analisi di benchmark o algoritmi? – Bozho

+0

L'ho usato in un progetto dopo aver fatto benchmark, sì. Non li ho più però. Pensandoci, se non fosse stato meglio, perché lo avrebbero sviluppato? Chi aggiungerà un'opzione 'replace()' più lenta al progetto String Utils? :-) – Brian

+1

in 1.4.2 non c'era un 'String.replace (stringa, stringa)'. Quindi era necessario nei comuni. Poi 1.5 l'ha aggiunto. – Bozho

1
  • String.replace(char, char) non può sostituire le stringhe intere
  • si possono avere valori null con StringUtils.replace(..).

String.replace(CharSequence s1, CharSequence s2) farà la stessa cosa se la prima stringa non è nulla. Altrimenti sarà gettare un NullPointerException

+0

Notato nullable con grazie! –

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

Tempo impiegato: 6400

Tempo impiegato: 5888

tempi sono quasi la stessa cosa!

Ho modificato il codice per eliminare i costi generali di replace2 che non erano dovuti all'implementazione JDK.

0

Per sostituire un carattere di stringa con un'altra stringa utilizzando StringUtil.Replace, ho provato a seguire e sta funzionando bene per me per sostituire più valori di stringa da una singola stringa.

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

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

Questo sostituirà il valore di stringa di informazioni con valore appena fornito ...