String
String: constante de cadena, la longitud de la cadena no se puede modificar. En Java, String es inmutable.
La clase String contiene la siguiente definición:
/** The value is used for character storage. */ private final char value[]; /** The offset is the first index of the storage that is used. */ private final int offset; /** The count is the number of characters in the String. */ private final int count;
El array utilizado para almacenar caracteres se declara como final, por lo que solo se puede asignar una vez y no se puede modificar.
StringBuffer(JDK1.0)
StringBuffer: variable de cadena (Synchronized, es decir, seguro para hilos). Si necesita modificar con frecuencia el contenido de una cadena, por razones de eficiencia es mejor usar StringBuffer. Si desea convertirlo al tipo String, puede llamar al método toString() de StringBuffer.
Java.lang.StringBufferSecuencia de caracteres mutable y segura para hilos. En cualquier momento contiene una secuencia de caracteres específica, pero mediante ciertas llamadas a métodos se puede cambiar la longitud y el contenido de dicha secuencia. El búfer de cadenas se puede usar de forma segura en múltiples hilos.
StringBufferLas operaciones principales son los métodos append e insert, que se pueden sobrecargar para aceptar cualquier tipo de datos. Cada método convierte eficazmente los datos dados en una cadena y luego agrega o inserta los caracteres de esa cadena en el búfer de cadenas.
- El método append siempre agrega estos caracteres al final del búfer;
- el método insert agrega caracteres en el punto especificado.
Por ejemplo, sizhace referencia a un objeto de búfer de cadenas cuyo contenido actual esstartentonces esta llamada al métodoz.append("le")hará que el búfer de cadenas contengastartle, yz.insert(4, "le")cambiará el búfer de cadenas para que contengastarlet 。
StringBuilder(JDK5.0)
StringBuilder: variable de cadena (no segura para hilos). Internamente, un objeto StringBuilder se trata como un array de longitud variable que contiene una secuencia de caracteres.
java.lang.StringBuilder es una secuencia de caracteres mutable, añadida en JDK 5.0. Esta clase proporciona una API compatible con StringBuffer, pero no garantiza la sincronización. Está diseñada como un reemplazo simple de StringBuffer, para cuando el búfer de cadenas es utilizado por un solo hilo (situación muy común).
Sus constructores son los siguientes:
| Constructor | Descripción |
| StringBuilder() | Crea un objeto StringBuilder con capacidad de 16 (16 elementos vacíos) |
| StringBuilder(CharSequence cs) | Crea un objeto StringBuilder que contiene cs, con 16 elementos vacíos añadidos al final |
| StringBuilder(int initCapacity) | Crea un objeto StringBuilder con capacidad initCapacity |
| StringBuilder(String s) | Crea un objeto StringBuilder que contiene s, con 16 elementos vacíos añadidos al final |
En la mayoría de los casos,StringBuilder > StringBuffer. Esto se debe principalmente a que el primero no necesita considerar la seguridad de los hilos.
Diferencias entre los tres
La principal diferencia de rendimiento entre String y StringBuffer: String es un objeto inmutable, por lo que cada vez que se modifica un tipo String, se genera un nuevo objeto String y el puntero apunta al nuevo objeto String. Por lo tanto, para cadenas cuyo contenido cambia con frecuencia, es mejor no usar String, porque cada vez que se genera un objeto se afecta el rendimiento del sistema, especialmente cuando hay muchos objetos sin referencia en la memoria, el GC de la JVM comienza a trabajar y el rendimiento disminuye.
Al usar la clase StringBuffer, cada vez se opera sobre el objeto StringBuffer en sí, 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 usar StringBuffer, especialmente cuando el objeto de cadena cambia con frecuencia.
En ciertos casos especiales, la concatenación de cadenas de un objeto String en realidad es compilada por el Compilador de Java como concatenación de objetos StringBuffer, por lo que en estos casos la velocidad del objeto String no es más lenta que la del objeto StringBuffer. Por ejemplo:
String s1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
La velocidad de generar el objeto String s1 no es más lenta que la de StringBuffer. De hecho, el Compilador de Java realiza automáticamente la siguiente conversión:
El Compilador de Java compila directamente la primera declaración anterior como:
String s1 = “This is only a simple test”;
Por lo tanto, es muy rápido. Pero hay que tener en cuenta que si las cadenas a concatenar provienen de otros objetos String, el Compilador de Java no hará la conversión automática y la velocidad no será tan rápida. Por ejemplo:
String s2 = “This is only a”; String s3 = “ simple”; String s4 = “ test”; String s1 = s2 + s3 + s4;
En este caso, el Compilador de Java seguirá estrictamente el método original. La operación de concatenación de String (es decir, +) se implementa mediante el método append de StringBuilder (o StringBuffer). En la situación anterior, si s2, s3 y s4 se definen como String, al concatenar se necesita crear adicionalmente un StringBuffer (o StringBuilder) y luego convertir el StringBuffer a String. Si se usa StringBuffer (o StringBuilder), no es necesario crear un StringBuffer adicional.
Estrategia de uso
-
(1) Principio básico: si se opera con una pequeña cantidad de datos, usar String; si un solo hilo opera con una gran cantidad de datos, usar StringBuilder; si múltiples hilos operan con una gran cantidad de datos, usar StringBuffer.
-
(2) No usar el operador "+" de la clase String para concatenaciones frecuentes, porque el rendimiento es muy pobre. Se debe usar la clase StringBuffer o StringBuilder. Este es un principio importante en la optimización de Java. Por ejemplo:
String result = ""; for (String s : hugeArray) { result = result + s; } // 使用StringBuilder StringBuilder sb = new StringBuilder(); for (String s : hugeArray) { sb.append(s); } String result = sb.toString();Cuando aparece la situación anterior, obviamente debemos usar el segundo método, porque el primer método, en cada iteración del bucle,crea un String result para guardar el resultado. Aparte de eso, ambos son básicamente iguales (paraversiones JDK 1.5 y posteriores)。
-
(3) Para obtener un mejor rendimiento, al construir StringBuffer o StringBuilder se debe especificar su capacidad siempre que sea posible. Por supuesto, si la longitud de la cadena que se opera no supera los 16 caracteres, no es necesario. Cuando no se especifica la capacidad, se construye por defecto un objeto con capacidad de 16. No especificar la capacidad reduce significativamente el rendimiento.
-
StringBuilder generalmente se usa dentro de métodos para completar+funciones similares, y como no es seguro para hilos, se puede descartar después de usarlo. StringBuffer se usa principalmente en variables globales.
-
(5) En las mismas condiciones, usar StringBuilder en lugar de StringBuffer solo ofrece una mejora de rendimiento de alrededor del 10%~15%, pero conlleva el riesgo de no ser seguro para múltiples hilos. En la programación modular real, el programador responsable de un módulo no siempre puede determinar claramente si el módulo se ejecutará en un entorno de múltiples hilos. Por lo tanto: solo si se confirma que el cuello de botella del sistema está en StringBuffer y se confirma que el módulo no se ejecutará en modo de múltiples hilos, se puede usar StringBuilder; de lo contrario, es mejor usar StringBuffer.
Fuente del artículo: https://blog.csdn.net/kingzone_2008/article/details/9220691