使用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方式实现的最后返回
- 使用java中汇编指令解析String对象(String s1="a";String s2=s1+"b";String s3=new String("a");String s4=s3+"a";)
- String s1 ; String s2=null ; String s3=”” ; String s4=new String(“”) ; 的区别。
- String s1="abc"; s2="abc" s3= new String("abc")为啥s1和s2的地址值一样而s1和s3的就不一样呢?
- String s1="a"和 Sting s2= new String("a")的区别
- String s1 = new String("abc"); String s2 = ("abc");
- 解析String s="a" 和 String s1=new String("a")生成时,内存中的变化
- String s2 = "abc"; 与 String s3 = new String("abc");原理解析
- Java基础---对String s1="abc"和String s2=new String("abc")的理解
- String s1=new String("haha")
- String s1==s2面试题
- String s1 = new String("abc")和String s2 = "abc"的区别
- String s1="AB"和String s2=new String("AB")的区别
- String a = new String("b");到底是几个对象
- String a = new String("b");到底是几个对象
- 黑马程序员--05.String字符串类--01. String s1=new String (a)内存图【个人总结】
- String a="1"; String a=new String(); String a=new String("1")区别
- String a="1"; String a=new String(); String a=new String("1")区别
- string a="1"; string a=new string(); string a=new string("1")区别
- How to do in-app purchase in ios5?
- VS2008 添加service引用和web引用的区别
- DCOM的學習和配置
- Swing框架之Component
- table拼接大图片时,取消图片之间的空隙
- 使用java中汇编指令解析String对象(String s1="a";String s2=s1+"b";String s3=new String("a");String s4=s3+"a";)
- 在新线程中使用NSTimer
- js模式对话框
- Asp.Net日期时间格式设置
- AS3常用编程小方法——取数组最大值/最小值
- android中View坐标学习
- OPENFILENAME structure
- 用户 'IIS APPPOOL\IdealTest' 登录失败解决方案
- hdu1166 敌兵布阵