使用java中汇编指令解析String对象(String s1="a";String s2=s1+"b";String s3=new String("a");String s4=s3+"a";)
2012-07-13 11:10
483 查看
首先介绍一下java方法执行过程:java的方法都是运行在线程的栈中,一个线程拥有一个执行栈,一个执行栈包含多个栈帧,一个方法对应一个栈帧,一个栈帧包含一个局部变量区(局部变量存储区域)和一个操作数栈区(用于运算或者其他的操作),当一个方法要执行时先会创建一个方法栈帧当方法执行完之后线程销毁栈帧。
public void show() { String s1="a"; //LDC "a" 加载字符串常量"a"到操作数栈 //ASTORE 1 保存字符串常量"a"到变量s1 String 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方法替代它,否则会因数据量过大而产生内存异常。
相关文章推荐
- [java] "Hello"和new String("Hello")产生String对象的区别
- String s1="abc"; s2="abc" s3= new String("abc")为啥s1和s2的地址值一样而s1和s3的就不一样呢?
- String s=new String("xyz") 创建了几个对象(详细解析)
- Java解析DBF文件,错误Failed to parse Number: For input string: "-.---" 或读取不出数据或乱码问题都在这里解决
- java后台服务器向手机端返回Json, 使用 "net.sf.json.JSONObject" 解析出现的异常问题
- Java中String str = new String("abc")创建了几个对象
- 使用Retrofit时出现 java.lang.IllegalArgumentException: URL query string "t={type}&p={page}&size={count}" must not have replace block. For dynamic query parameters use @Query.异常原因
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
- String str = new String("hello"); str+="Java";这两句代码共有几个对象?
- IBM Java面试题,String s = "a" + "b" + "c" + "d" + "e"; 问此语句共创建了几个对象
- Java String = "" 和 new String()区别
- 【Java基础一】String创建对象"" && null
- String s3 = "hel" + new String("lo");做了什么
- java "回调【 Callback 】" 的理解和使用<借鉴>
- String s=new String("xyz");创建几个String对象的问题
- 使用封装类进行转换时候报错,java.lang.NumberFormatException: For input string: ""
- 使用beanShell来解析执行java的String方法,类似javascipt的eval方法
- 解析Java中的String对象的数据类型
- java.lang.NumberFormatException: For input string: "0 "
- 全面解析java中的String对象