2011-08-10 7 views
10

¿Cuál sería la diferencia entre la implementación de reemplazo de Java 1.4.2 y la implementación de Apache 2.3? ¿Hay un rendimiento ganar uno sobre el otro?Apache StringUtils vs implementación de Java de replace()

Java 1.4.2 replace

Apache 2.3 replace

+0

¿Existe una razón específica que estés preguntando por una versión antigua de Java? –

+0

Hola Jochim, estoy sorprendido con una antigua versión de Java que debo mantener. :( –

+0

Tenga en cuenta que 'String.replace (CharSequence, CharSequence)' utiliza regexp internamente. :(Vea http://stackoverflow.com/questions/16228992/commons-lang-stringutils-replace-performance-vs-string-replace – Vadzim

Respuesta

17

El método String.replace() que ha vinculado toma dos valores de char, por lo que solo reemplaza el carácter con otro (posiblemente varias veces).

El método StringUtils.replace() por otro lado toma String valores como la cadena de búsqueda y el reemplazo, por lo que puede reemplazar subcadenas más largas. El método comparable en Java sería replaceAll(). replaceAll() es probable que sea más lento que el método StringUtils, porque admite expresiones regulares y, por lo tanto, introduce la sobrecarga de compilar primero la cadena de búsqueda y ejecutar una búsqueda de expresiones regulares.

Tenga en cuenta que Java 5 introdujo String.replace(CharSequence, CharSequence) que hace lo mismo que StringUtils.replace(String,String) (excepto que lanza una NullPointerException si alguno de sus argumentos son null). Tenga en cuenta que CharSequence es una interfaz implementada por String, por lo que puede usar objetos antiguos simples String aquí.

+2

+1 para señalar que java.lang.String.replaceAll (...) usa expresiones regulares y es lento. El algoritmo utilizado por StringUtils.replace (...) es muy superior y supera a replaceAll() –

+0

@JoachimSauer, el la respuesta en http://stackoverflow.com/a/4874768/910201 menciona '.replaceEach()', pero ¿de dónde viene? No tengo acceso a dicho método y he intentado importar 'org.springframework. util.StringUtils', 'org.apache.soap.util.StringUtils',' org.apache.axis.utils.StringUtils', y 'com.ibm.wsdl.util.StringUtils'. – Xonatron

+0

@MatthewDoucette: la respuesta está en los comentarios de la respuesta a la que vinculó: Apache Commons-Lang 'StringUtils' desde la Versión 2.4. –

2

1.4.2 sustituye funciona solamente con argumentos char mientras que el Apache 2.3 se toma en las cadenas.

0

Apache es bastante más rápido, si no recuerdo mal. Recomendado.

+0

¿Cómo se puede r? ¿Tiene análisis de referencia o algoritmo? – Bozho

+0

Lo usé en un proyecto después de haber hecho puntos de referencia, sí. Yo ya no los tengo. Pensando en eso, si no era mejor, ¿por qué lo desarrollarían? ¿Quién agregará una opción 'replace()' más lenta al proyecto String Utils? :-) – Brian

+1

en 1.4.2 no había un 'String.replace (string, string)'. Entonces fue necesario en bienes comunes. Luego 1.5 lo agregó. – Bozho

1
  • String.replace(char, char) no puede reemplazar cadenas enteras
  • que puede tener valores null con StringUtils.replace(..).

String.replace(CharSequence s1, CharSequence s2) harán lo mismo si la primera cadena no es nula. De lo contrario será lanzar una NullPointerException

+0

¡Anotado con anotaciones y gracias! –

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

Tiempo empleado: 6400

Tiempo empleado: 5888

Los tiempos son casi lo mismo!

He editado el código para omitir los gastos generales de replace2 que no se debieron a la implementación de JDK.

0

Para reemplazar un carácter de cadena con otra cadena usando StringUtil.Replace, traté de seguir y me está funcionando bien para reemplazar varios valores de cadena de una sola cadena.

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

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

Esto reemplazará el valor de cadena de información con el nuevo valor proporcionado ...