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 StringBuilder
reemplazado String
.
Sabemos que la razón por la cual su uso StringBuilder
es 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 usePlus
funciones y useStringBuilder
las 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 laStringBuffer
clase o una técnica similar para reducir el número de intermediosString
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 !