1 cuerda
Cadena: cadena constante, la longitud de la cadena es inmutable.
2 stringbuffer
StringBuffer: String Variable (sincronizado, es decir, Safe Safe). Si desea modificar con frecuencia el contenido de cadena, es mejor usar StringBuffer por razones de eficiencia. Si desea convertir al tipo de cadena, puede llamar al método ToString () de StringBuffer.
Java.lang.StringBuffer Secuencia de carácter mutable Safe Safe. Contiene una cierta secuencia de caracteres en cualquier momento, pero la longitud y el contenido de la secuencia pueden cambiarse mediante algunas llamadas de método. Los búferes de cadena se pueden usar de manera segura para múltiples hilos.
Las operaciones principales en StringBuffer son los métodos de adjunto e inserto, que se pueden sobrecargar para aceptar cualquier tipo de datos. Cada método puede convertir efectivamente los datos especificados en una cadena, y luego agregar o insertar los caracteres de la cadena en el búfer de cadena. El método de agregado siempre agrega estos caracteres al final del búfer; El método de inserción agrega caracteres en el punto especificado. Por ejemplo, si Z se refiere a un objeto de búfer de cadena cuyo contenido actual es "inicio", este método llama z.append ("le") hace que el búfer de cadena contenga "sobresalto", y z.insert (4, "le") cambia el búfer de cadena para contener "estrella de estrella".
3 StringBuilder
StringBuilder: String Variable (sin hito).
Java.lang.StringBuilder es una secuencia de caracteres variable que se agrega recientemente a JDK5.0. Esta clase proporciona una API compatible con StringBuffer, pero no se garantiza que se sincronice. Esta clase está diseñada para ser un simple reemplazo para StringBuffer, cuando los búferes de cadena son utilizados por un solo hilo (esto es común). Si es posible, se recomienda tomar esta clase primero, porque en la mayoría de las implementaciones es más rápido que StringBuffer. Los métodos de ambos son básicamente los mismos.
En la mayoría de los casos, StringBuilder> StringBuffer.
4 La diferencia entre los tres
La principal diferencia de rendimiento entre el tipo de cadena y StringBuffer: String es un objeto inmutable. Por lo tanto, cada vez que se cambia el tipo de cadena, se generará un nuevo objeto de cadena, y luego el puntero se apuntará a un nuevo objeto de cadena. Por lo tanto, es mejor no usar cadenas para cadenas que a menudo cambian de contenido, porque cada vez que se genera el objeto, tendrá un impacto en el rendimiento del sistema, especialmente cuando hay demasiados objetos referenciados en la memoria, el GC del JVM comenzará a funcionar y el rendimiento se degradará.
Al usar la clase StringBuffer, el objeto StringBuffer en sí mismo se opera cada vez en lugar de generar un nuevo objeto y cambiar la referencia del objeto. Por lo tanto, en la mayoría de los casos, se recomienda StringBuffer, especialmente cuando los objetos de cadena a menudo se cambian.
En algunos casos especiales, el empalme del objeto de cadena realmente es interpretado por el JVM como un empalme del objeto StringBuffer, por lo que la velocidad del objeto de cadena no es más lenta que el objeto StringBuffer en estos momentos, por ejemplo:
Cadena s1 = "Esto es solo una" + "simple" + "prueba"; StringBuffer sb = new StringBuilder ("Esto es solo un"). Append ("Simple"). Append ("Test"); La generación de objetos S1 String no es más lento que StringBuffer. De hecho, en el JVM, la siguiente conversión se realiza automáticamente:
Cadena s1 = "Esto es solo una" + "simple" + "prueba";
El JVM trata directamente la declaración anterior como:
String S1 = "Esta es solo una prueba simple";
Entonces la velocidad es muy rápida. Pero debe tenerse en cuenta que si la cadena empalmada proviene de otro objeto de cadena, el JVM no se convertirá automáticamente, y la velocidad no será tan rápida, por ejemplo:
String S2 = "Esto es solo un"; String S3 = "Simple"; String S4 = "Test"; String S1 = S2 + S3 + S4;
En este momento, el JVM lo hará de manera regular de la manera original.
En la mayoría de los casos, cadena StringBuffer>.
4.StringBuffer y StringBuilder
Casi no hay diferencia entre los dos. Básicamente llaman varios métodos de la clase principal. Una diferencia importante es que StringBuffer es seguro de hilo. La mayoría de los métodos internos tienen la palabra clave sincronizada antes, lo que causará cierto consumo de rendimiento. StringBuilder no es seguro de huella, por lo que es más eficiente.
public static void main (string [] args) lanza la excepción {String String = "0"; int n = 10000; long begin = System.CurrentTimemillis (); para (int i = 1; i <n; i ++) {string+= i; } Long End = System.CurrentTimemillis (); largo entre = end - begin; System.out.println ("Tiempo consumido con la clase de cadena:" + entre + "ms"); int n1 = 10000; StringBuffer sb = new StringBuffer ("0"); long begin1 = System.CurrentTimemillis (); para (int j = 1; j <n1; j ++) {sb.append (j); } Long End1 = System.CurrentTimemillis (); largo entre1 = end1 - begin1; System.out.println ("Tiempo consumido con la clase StringBuffer:" + entre 1 + "MS"); int n2 = 10000; StringBuilder sb2 = new StringBuilder ("0"); long begin2 = System.CurrentTimemillis (); para (int k = 1; k <n2; k ++) {sb2.append (k); } largo end2 = System.CurrentTimemillis (); largo entre2 = end2 - begin2; System.out.println ("Consumir el tiempo para usar la clase StringBuilder:" + entre 2 + "MS"); } Producción:
Tiempo para usar la clase String: 982ms Tiempo para usar StringBuffer Clase: 2MS Time to Using Class StringBuilder: 1ms
Aunque este número es diferente cada vez, y la situación de cada máquina es diferente, hay varios puntos ciertos, y la clase de cadena consume significativamente más que los otros dos. Otro punto es que StringBuffer consume más que StringBuilder, aunque la diferencia no es obvia.
5 Estrategias de uso
(1) Principios básicos: si desea operar una pequeña cantidad de datos, use cadena; Si opera una gran cantidad de datos con un solo hilo, use StringBuilder; Si opera una gran cantidad de datos con un subproceso múltiple, use StringBuffer.
(2) No use el "+" de la clase de cadena para el empalme frecuente, porque si el rendimiento es extremadamente pobre, debe usar la clase StringBuffer o StringBuilder, que es un principio relativamente importante en la optimización de Java. Por ejemplo: cuando se usa cadena, al empalmar las cadenas, use "+" para formar un objeto StringBuffer temporal en el JVM, y al mismo tiempo, se crea un objeto en cada cadena. Después de empalmar dos cadenas, ¡se necesitan crear un total de 4 objetos! (Una cadena que contiene el resultado, dos objetos de cadena y un objeto StringBuffer temporal). Si usa StringBuffer, ¡solo necesita crear 2 objetos! Un objeto StringBuffer y un objeto String que contiene el último resultado.
(3) Para un mejor rendimiento, su capacidad debe especificarse tanto como sea posible al construir STOWNGBUFFER o STOWNGBuilder. Por supuesto, si la cadena que opera no excede los 16 caracteres de longitud, no la necesitará. No especificar la capacidad reducirá significativamente el rendimiento.
(4) StringBuilder se usa generalmente dentro del método para completar funciones "+" similares. Porque ? es seguro de hilo, se puede descartar después de su uso. StringBuffer se usa principalmente en variables globales.
(5) El uso de STOWNGBuilder en la misma situación solo puede lograr una mejora del rendimiento de aproximadamente 10% ~ 15% en comparación con el uso de StringBuffer, pero asciende el riesgo de inseguro múltiple. En la programación modular real, el programador responsable de un determinado módulo puede no ser capaz de determinar claramente si el módulo se colocará en un entorno de múltiples hilos. Por lo tanto, StringBuilder solo se puede usar a menos que esté seguro de que el cuello de botella del sistema está en StringBuffer y está seguro de que su módulo no se ejecutará en modo múltiple; De lo contrario, StringBuffer todavía se usa.