几个String对象?

类别:Java 点击:0 评论:0 推荐:

Author:zfive5(zhaozidong)
Email :[email protected]

    元旦时朋友问我XXX操作生成几个String对象--它也在java的面试题里经常出,
我当时用java反编译工具反了一段class代码让他看,的确一切都那么一目了然!
(注:以下是我事后重写的代码)


Java:

package zf5;

public class ZF5
{

    public ZF5()
    {
    }

    public static void main(String args[])
    {
        ZF5 ZF51 = new ZF5();
        String a = "zfive5";
        String a1 = new String("Hello zfive5");
        String a2 = a;
        long a3 = 5L;
        Long a4 = new Long(1L);
    }
}


bytecode:

package zf5;

public class ZF5
{

    public ZF5()
    {
    //    0    0:aload_0        
    //    1    1:invokespecial   #1   <Method void Object()>
    //    2    4:nop            
    //    3    5:return         
    }

    public static void main(String args[])
    {
   
    //    略过
    //    0    0:new             #2   <Class ZF5>
    //    1    3:dup            
    //    2    4:invokespecial   #3   <Method void ZF5()>
    //    3    7:astore_1       
   
   
    //    把const pool中的常量4的引用压栈,然后弹出赋值给本地变量2(String a),系统自动生成"zfive5"常量
    //    4    8:ldc1            #4   <String "zfive5"> 
    //    5   10:astore_2
         
   
    //    生成一个string对象,把它引用压栈,然后通过dup指令复制此引用并压入栈顶
    //    6   11:new             #5   <Class String>
    //    7   14:dup            
    //    同上ldc1
    //    8   15:ldc1            #6   <String "Hello zfive5">
    //    此时堆栈中的参数为  refojbect  refString, "Hello Zfive5",当调用完invokespecial指令后,string对象初始化成功
    //    9   17:invokespecial   #7   <Method void String(String)>
    //   把堆栈中的String对象的引用赋值给本地变量3(String a),可以看出有两string对象参加此时操作
    //   10   20:astore_3       
   
   
    //   把本地变量2的引用压入栈,然后通过astore赋值给本地变量4
    //   11   21:aload_2        
    //   12   22:astore          4
   
   
    //   把const pool中常量8压栈,然后赋值给本地变量5
    //   13   24:ldc2w           #8   <Long 5L>
    //   14   27:lstore          5
   
   
    //   基本同上  注意new了一个对象Long
    //   15   29:new             #10  <Class Long>
    //   16   32:dup            
    //   17   33:lconst_1       
    //   18   34:invokespecial   #11  <Method void Long(long)>
    //   19   37:astore          7
   
   
    //   返回
    //   20   39:nop            
    //   21   40:return         
    }
}

本文地址:http://com.8s8s.com/it/it12093.htm