javap:String +
2015-10-30 20:28
423 查看
源代码:
javap:反编译结果
对照程序可以更好的理解反编译命令,留作以后参考。
可以看到:jvm对于String+String操作符做了优化,通过StringBuilder.append方法来执行+操作,缺点如上所示,在循环执行+操作时,每次都会创建一个新的StringBuilder。
public class Test{ public static void main(String[]args){ String x = ""; for(int i=0;i<10;i++){ x+="abc"; } System.out.println(x); } }
javap:反编译结果
public static void main(java.lang.String[]); Code: 0: ldc #2; //String --ldc:常数到操作数栈 "" 2: astore_1 --astore:将引用类型或returnAddress类型值存入局部变量 String x = "" 3: iconst_0 --iconst_0:将int类型常量0压入栈 4: istore_2 --istore:将int类型值存入局部变量 int i = 0 5: iload_2 --iload:从局部变量装载int类型值 取出i 6: bipush 10 --bipush:将一个8位带符号整数压入栈 压入10 8: if_icmpge 37 --if_icmpge:如果一个int类型值大于或者等于另外一个int类型值,则跳转 执行i<10判断 11: new #3; //class java/lang/StringBuilder 14: dup 15: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 18: aload_1 --aload:从局部变量装载引用型数据 取出String x(""); 19: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/String 22: ldc #6; //String abc 24: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/String 27: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 30: astore_1 --astore:将引用类型或returnAddress类型值存入局部变量 将toString结果赋值给x 31: iinc 2, 1 --iinc:将一个常量值加到一个int类型的局部变量上 i+1 34: goto 5 37: getstatic #8; //Field java/lang/System.out:Ljava/io/PrintStream; 40: aload_1 41: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 44: return
对照程序可以更好的理解反编译命令,留作以后参考。
可以看到:jvm对于String+String操作符做了优化,通过StringBuilder.append方法来执行+操作,缺点如上所示,在循环执行+操作时,每次都会创建一个新的StringBuilder。
相关文章推荐
- windows命令行中java和javac、javap使用详解(java编译命令)
- 字节码防止内存错误提高代码质量
- JNI_Java Native Interface
- Android NDK 学习笔记
- javap -c命令详解
- 为eclipse配置javap命令
- 【JAVA】javap——字节码格式查看工具
- Android NDK开发(五)——C代码回调Java代码
- 深入理解Java中为什么内部类可以访问外部类的成员
- 学习Scala:Scala中的字段和方法
- 从一道++操作面试题说起(Javap)
- javap -s 查看java方法签名
- JNI_Java Native Interface
- java字节码忍者禁术
- java,class,dex转换过程
- javap -c 命令大全
- Java命令——javap
- Eclipse中使用javap命令打出字节码虚指令
- String sb = new String("sb");到底创建了几个实例?
- 利用javap -verbose 查看java程序运行内存分配情况