Profundidad de análisis 'StringBuilder' se puede sustituir con puntas 'cadena'

I. Antecedentes

Al escribir código cuando se utiliza StringBuilder cadena de costura, IDEA es probable que dar los siguientes consejos: 'StringBuilder' puede sustituirse por 'Cadena'.

Así que ¿por qué dar la señal? Lo que impulsó a este medio?

En segundo lugar, pensar

No se habla de antes: "Detrás de cada pregunta se oculta al menos un punto ciego y una gran oportunidad para aprender." Por lo tanto, no vamos a dejar ir fácilmente de esta oportunidad.

También una gran cantidad de personas que este tiempo puede comenzar Baidu arriba!

Stop! !

"" Ali Baba Java Development Manual "Comentarios" la columna, se mencionan "verificación pensamiento primera conjetura", de gran ayuda en el aprendizaje del código fuente, etc., de modo que la impresión será más profunda.

El Consejo: 'StringBuilder' se puede reemplazar con 'cadena', se describe en este caso puede ser StringBuilderreemplazado String.

Sabemos que la razón por la cual su uso StringBuilderes para evitar la concatenación de cadenas proceso produce una gran cantidad de objeto de cadena innecesaria.

Dado que puede ser sustituido String, ambos de los cuales pueda ser descrito en este caso es equivalente, es decir la parte inferior es la misma.

En tercer lugar, el análisis

"Columna" Manual Ali Baba de Desarrollo de Java "Comentarios" , no se habló de la escritura DEMO, descompilar y desensamblar es un medio importante para el aprendizaje.

Que se escribe una verificación directa DEMO debajo de ella:

public class StringDemo {

    public static void main(String[] args) {
        String a = "a";
        Integer b = 0;
        Long c = 1000L;
        useStringBuilder(a, b, c);
        usePlus(a, b, c);
    }

    /**
     * 使用 StringBuilder 拼接
     */
    private static void useStringBuilder(String a, Integer b, Long c) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(a).append(b).append(c);
        System.out.println(stringBuilder.toString());
    }

    /**
     * 直接使用+号进行字符串拼接
     */
    private static void usePlus(String a, Integer b, Long c) {
        System.out.println(a + b + c);
    }

}

Uso idea viene decompilador, y se encontró que casi la misma fuente (no se da aquí).

El siguiente intento de desmontar javap -c -p StringDemo(previamente ha sido compilado por javac):

public class com.chujianyun.common.str.StringDemo {
  public com.chujianyun.common.str.StringDemo();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String a
       2: astore_1
       3: iconst_0
       4: invokestatic  #3                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       7: astore_2
       8: ldc2_w        #4                  // long 1000l
      11: invokestatic  #6                  // Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
      14: astore_3
      15: aload_1
      16: aload_2
      17: aload_3
      18: invokestatic  #7                  // Method useStringBuilder:(Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Long;)V
      21: aload_1
      22: aload_2
      23: aload_3
      24: invokestatic  #8                  // Method usePlus:(Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Long;)V
      27: return

  private static void useStringBuilder(java.lang.String, java.lang.Integer, java.lang.Long);
    Code:
       0: new           #9                  // class java/lang/StringBuilder
       3: dup
       4: invokespecial #10                 // Method java/lang/StringBuilder."<init>":()V
       7: astore_3
       8: aload_3
       9: aload_0
      10: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      13: aload_1
      14: invokevirtual #12                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      17: aload_2
      18: invokevirtual #12                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      21: pop
      22: getstatic     #13                 // Field java/lang/System.out:Ljava/io/PrintStream;
      25: aload_3
      26: invokevirtual #14                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      29: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      32: return

  private static void usePlus(java.lang.String, java.lang.Integer, java.lang.Long);
    Code:
       0: getstatic     #13                 // Field java/lang/System.out:Ljava/io/PrintStream;
       3: new           #9                  // class java/lang/StringBuilder
       6: dup
       7: invokespecial #10                 // Method java/lang/StringBuilder."<init>":()V
      10: aload_0
      11: invokevirtual #11                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      14: aload_1
      15: invokevirtual #12                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      18: aload_2
      19: invokevirtual #12                 // Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;
      22: invokevirtual #14                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      25: invokevirtual #15                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      28: return
}

Nota: también puede utilizar las columnas primeros bocados artículo recomienda jclasslib plug-ins de código de bytes a la vista de código de bytes

Podemos comparar las usePlusfunciones y useStringBuilderlas instrucciones de código de bytes encontraremos función + número variable de cinta de empalme con el tiempo se convierte en un StringBuilder cadena de empalme.

optimización del compilador equivalente, por lo que es equivalente, IDEA detectada para hacer el código más compacto, se da por aludido.
Para probar esta idea, una vez más abrimos el "lenguaje Java Specification" 15.18.1 Concatenación de cadenas Operador +. :

Una implementación puede elegir para llevar a cabo la conversión y la concatenación en un solo paso para evitar la creación y después de descartar un intermedio String objeto. Para aumentar el rendimiento de la concatenación de cadenas repetidas, un compilador de Java puede utilizar la StringBuffer clase o una técnica similar para reducir el número de intermedios String objetos que se crean mediante la evaluación de una expresión.

lenguaje Java puede optar por realizar la conversión y empalme en un solo paso, con el fin de evitar en primer lugar crear y luego desechar el medio del objeto de cadena. Para mejorar el rendimiento del operador de concatenación de cadenas, compilador Java puede utilizar la clase StringBuilder función o técnicas similares para reducir el número de objeto de cadena intermedia creada cuando la expresión de cálculo.

Entonces la pregunta es completamente claro.

IV Resumen

Antes de que escribió "¿Por qué debe recomendar a todos a aprender el código de bytes" y "Cada pregunta se ocultan detrás de al menos un punto ciego y una gran oportunidad para aprender," dos artículos. Espero que puedan entender realmente la utilidad de aprendizaje de código de bytes; Barbara puede aprovechar todas las dudas, a través de la exploración en profundidad de cada pregunta a un profundo conocimiento del conocimiento. También le recomendamos mirar al "lenguaje Java Specification" y "Java Virtual normas", que son más completos y de mayor autoridad.

Espero que esto le puede ayudar. Si usted tiene alguna pregunta y desea comunicarse conmigo, la bienvenida a los comentarios de licencia.

Si mi artículo útil, atención de bienvenida, punto como comentario! Para usted !

Publicados 379 artículos originales · ganado elogios 862 · Vistas 1,32 millones +

Supongo que te gusta

Origin blog.csdn.net/w605283073/article/details/104327178
Recomendado
Clasificación