使用java中汇编指令解析String对象(String s1="a";String s2=s1+"b";String s3=new String("a");String s4=s3+"a";)

来源:互联网 发布:辐射4原版捏脸数据 编辑:程序博客网 时间:2024/05/29 09:45
首先介绍一下java方法执行过程:java的方法都是运行在线程的栈中,一个线程拥有一个执行栈,一个执行栈包含多个栈帧,一个方法对应一个栈帧,一个栈帧包含一个局部变量区(局部变量存储区域)和一个操作数栈区(用于运算或者其他的操作),当一个方法要执行时先会创建一个方法栈帧当方法执行完之后线程销毁栈帧。
public void show(){String s1="a";//LDC "a" 加载字符串常量"a"到操作数栈//ASTORE 1 保存字符串常量"a"到变量s1String s2=s1+"b";//这里调用StringBuffer操作并创建一个String对象//NEW java/lang/StringBuffer 创建StringBuffer对象   // DUP 复制StringBuffer对象   // ALOAD 1 加载字符变量s1到操作数栈   // INVOKESTATIC java/lang/String.valueOf (Ljava/lang/Object;)Ljava/lang/String;调用String的静态方法valueOf   // INVOKESPECIAL java/lang/StringBuffer.<init> (Ljava/lang/String;)V 调用StringBuffer的构造函数   // LDC "b"加载字符串常量“b”到操作数栈   // INVOKEVIRTUAL java/lang/StringBuffer.append (Ljava/lang/String;)Ljava/lang/StringBuffer;调用SringBuffer的append方法追加字符串“b”   // INVOKEVIRTUAL java/lang/StringBuffer.toString ()Ljava/lang/String;调用StringBuffer的toString方法   // ASTORE 2保存字符串对象到s2变量中String s3=new String("ab");//NEW java/lang/String创建String对象   // DUP复制String对象   // LDC "ab"加载字符串常量到操作数栈   // INVOKESPECIAL java/lang/String.<init> (Ljava/lang/String;)V调用String的构造函数   // ASTORE 3保存String对象到变量s3中String s4=s3+"c";//这里调用StringBuffer操作并创建一个String对象//NEW java/lang/StringBuffer创建StirngBuffer对象   // DUP复制StringBuffer对象   // ALOAD 3加载变量s3   // INVOKESTATIC java/lang/String.valueOf (Ljava/lang/Object;)Ljava/lang/String;调用String的静态方法valueOf   // INVOKESPECIAL java/lang/StringBuffer.<init> (Ljava/lang/String;)V调用StringBuffer的构造函数   // LDC "c"加载字符串常量到操作数栈   // INVOKEVIRTUAL java/lang/StringBuffer.append (Ljava/lang/String;)Ljava/lang/StringBuffer;调用SringBuffer的append方法追加字符串“c”   // INVOKEVIRTUAL java/lang/StringBuffer.toString ()Ljava/lang/String;调用StringBuffer的toString方法   // ASTORE 4保存字符串对象到s4变量中
            System.out.println("ab"==s2);//结果是false,"ab"是字符串常量而s2是String在堆中的对象所以为false
            System.out.println(s2+"c"==s4);//结果是false,s2+"c"将产生一个String对象到堆中而s4本身是堆中的一个对象,所以两个对象比较为false
}


 通过以上的class指令分析知道:String s2=s1+"b";//是调用stringBuffer操作并创建一个String对象也就是说+操作符使用StringBuffer的append方式实现的最后返回

一个新创建的String对象而不是string常量。"a"+"b"等价于"ab",只是生成一个字符串常量,保存在栈中而String s2=s1+"b";保存在堆中。凡是字符串变量与字符串变量或者字符串常量之间使用+都会产生一个String对象到堆中,凡是String s="a"+"b";或者String s="ab";产生一个字符串常量在栈中。凡是在for循环中遇到字符串+操作的最好使用StringBuffer的append方法替代它,否则会因数据量过大而产生内存异常。
原创粉丝点击