Comparación de String, StringBuilder, StringBuffer

A menudo no tenemos clara la distinción entre Sting / stringBuffer / StringBuilder, así que escribe un blog para resumir:

El valor de String no se puede modificar, y cada operación en String generará un nuevo objeto, desperdiciando mucho espacio; el
valor de Stringbuffer se puede cambiar, la eficiencia es general, el
valor de StringBuilder seguro para subprocesos se puede cambiar, la eficiencia es alta, el subproceso no a salvo

1. La variabilidad de los tres valores

String es inmutable porque en realidad es una matriz de caracteres en la parte inferior de String, que tiene una longitud fija.
Eche un vistazo al código original de String:

/** The value is used for character storage. */
    private final char value[];

 public String(char value[]) {
    
    
        this.value = Arrays.copyOf(value, value.length);
    }

Se puede ver que la longitud se especifica de acuerdo con la longitud de la cadena definida, por lo que no hay forma de cambiar su longitud. Operar en String generará un nuevo objeto, que también es una nueva matriz. Imagínese si usa String para realizar cambios en un bucle, desperdicia mucho espacio.
Echemos un vistazo al código fuente de StringBuilder y StringBuffer:

public StringBuilder(String str) {
    
    
        super(str.length() + 16);
        append(str);
    }
 public StringBuffer(String str) {
    
    
        super(str.length() + 16);
        append(str);
    }

Se puede ver que los valores de Stringbuffer y StringBuilder se pueden cambiar.

2. La relación de herencia entre String, StringBuffer y StringBuilder

Inserte la descripción de la imagen aquí
Podemos observar la relación de herencia de los tres a partir del código fuente de los tres.

3. La eficiencia de String, StringBuffer, Stringbuilder

En primer lugar, StringBuilder se creó después de StringBuilder. Si no se menciona la seguridad de los hilos, StringBuilder es, por supuesto, el más rápido.
Entonces echemos un vistazo a String.

String str="hello"+"world";//代码1
String s1="hello";
String s2="world";
String s12=s1+s2;//代码2
StringBuilder sb=new StringBuilder(s1);
sb.append(s2);//代码3

Observamos el código anterior: El código 1 es una operación + constante, el código 2 es una operación + variable;
Código 1: De hecho, el código "hola" + "mundo" está conectado durante la fase de compilación y apunta al par de cadenas en el montón Me gusta, cuando corra, sácalo del montón. Almacenado en la variable local str. Parece ser una operación de escoger y colocar.
Código 2: Cuando String usa la operación +, en realidad se divide en tres pasos:
(1) Stringbuilder temp = new StringBuilder (s1);
(2) temp.append (s2);
(3) str = temp.toString ();
Solo un signo + realiza estos tres pasos y crea el objeto String y el objeto Stringbuilder al mismo tiempo. Si el bucle es decenas de miles de veces, se crearán decenas de miles de dos objetos. ¿No es una pérdida de tiempo? y espacio?
Código 3: Lo que se hace en la capa inferior es expandir continuamente la longitud de la matriz de caracteres y luego pegar el nuevo contenido detrás de la matriz original. Solo hice la expansión y esas cosas.
Resumen: Stringbuilder y Stringbuffer tienen la mayor eficiencia en el uso de append.

4. Problemas de seguridad de String, StringBuffer, StringBuilder

¿Por qué no es seguro el subproceso de Stringbuilder, mientras que stringbuffer es seguro para subprocesos? Podemos mirar el código fuente de ambos. Muchos métodos en Stringbuffer son modificados por Synchronized. Como todos sabemos, se agrega al método la modificación Sincronizada, es decir, se agrega un candado. Cuando un objeto obtiene el candado, se puede realizar la operación en el método. En este momento, otros subprocesos no pueden obtener el candado. Operación no provocará fenómenos inseguros. Por supuesto, nadie tomará el bloqueo si es de un solo subproceso, y Stringbuffer es tan seguro como Stringbuilder.
En cuanto a String, su valor no se puede cambiar, si se cambia se generará un nuevo objeto, por lo que debe ser seguro.

Supongo que te gusta

Origin blog.csdn.net/weixin_43815275/article/details/113846296
Recomendado
Clasificación