• java虚拟机的符号引用和直接引用


      在java中,一个java类将会编译成一个class文件。在编译时,java类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。比如org.simple.People类引用org.simple.Tool类,在编译时People类并不知道Tool类的实际内存地址,因此只能使用符号org.simple.Tool(假设)来表示Tool类的地址。而在类装载器装载People类时,此时可以通过虚拟机获取Tool类 的实际内存地址,因此便可以既将符号org.simple.Tool替换为Tool类的实际内存地址,及直接引用地址。

    总结:JVM对于直接引用和符号引用的处理是有区别的,可以看到符号引用时,JVM将使用StringBuilder来完成字符串的  添加,而直接引用时则直接使用String来完成;直接引用永远比符号引用效率更快,但实际应用开发中不可能全用直接引用,要提高效能可以考虑按虚拟机的思维来编写你的程序。

    1.0 直接引用:

    public class StringAndStringBuilder{
       public static void main(String[] args){    
           System.out.println ("s=" + "asdfa");
       }
    }

    2.0 符号引用:

    public class StringAndStringBuilder{
       public static void main(String[] args){    
          String s="asdfa";
            System.out.println ("s=" + s);
       }
    }

    1. /** 
    2.  *  
    3.  */  
    4. package com.bzu.csh;  
    5.   
    6. import java.util.Random;  
    7.   
    8. /** 
    9.  *  
    10.  * 项目名称:Test1 类名称:Test2 类描述: 创建人:admin 创建时间:2017年1月7日 下午9:41:36 修改人:admin 
    11.  * 修改时间:2017年1月7日 下午9:41:36 修改备注: 
    12.  *  
    13.  * @version 
    14.  *  
    15.  */  
    16. class Test4 {  
    17.     public static final int i = 6 / 2;// 编译时就处理了,即i =  
    18.                                         // 3;不初始化类,static代码块和静态初始化块不执行  
    19.     public static final int j = new Random().nextInt();// 运行时处理,需要初始化类,都执行  
    20.     static {  
    21.         System.out.println("static 静态代码块");  
    22.     }  
    23.     {  
    24.         System.out.println("初始化块");  
    25.     }  
    26. }  
    27.   
    28. public class Test3 {  
    29.   
    30.     /** 
    31.      * @param args 
    32.      *            2017年1月7日 
    33.      */  
    34.     public static void main(String[] args) {  
    35.         System.out.println(Test4.i);  
    36.     }  
    37. }  

    只有主动调用时才初始化类

    [java] view plain copy
     
    1. /** 
    2.  *  
    3.  */  
    4. package com.bzu.csh;  
    5.   
    6. import java.util.Random;  
    7.   
    8. /** 
    9.  *  
    10.  * 项目名称:Test1 类名称:Test2 类描述: 创建人:admin 创建时间:2017年1月7日 下午9:41:36 修改人:admin 
    11.  * 修改时间:2017年1月7日 下午9:41:36 修改备注: 
    12.  *  
    13.  * @version 
    14.  *  
    15.  */  
    16. class Test6 {  
    17.     public static final int a = 6 / 2;// 编译时就处理了,即i = 3  
    18.     // 3;不初始化类,static代码块和静态初始化块不执行  
    19.     public static final int b = new Random().nextInt(10);// 运行时处理,需要初始化类,都执行  
    20.     static {  
    21.         System.out.println("Test6  static 静态代码块" + a + ":" + b);  
    22.     }  
    23.     {  
    24.         System.out.println("Test6  初始化块");  
    25.     }  
    26. }  
    27.   
    28. class Test4 extends Test6 {  
    29.     public static final int i = 6 / 2;// 编译时就处理了,即i = 3  
    30.                                         // 3;不初始化类,static代码块和静态初始化块不执行  
    31.     public static final int j = new Random().nextInt(10);// 运行时处理,需要初始化类,都执行  
    32.     static {  
    33.         System.out.println("Test4  static 静态代码块" + i + ":" + j);  
    34.     }  
    35.     {  
    36.         System.out.println("Test4  初始化块");  
    37.     }  
    38.   
    39. }  
    40.   
    41. public class Test3 {  
    42.   
    43.     /** 
    44.      * @param args 
    45.      *            2017年1月7日 
    46.      */  
    47.     static {  
    48.         System.out.println("Test3");  
    49.     }  
    50.   
    51.     public static void main(String[] args) {  
    52.         // Test4 t = new Test4();结果如下:执行了初始化块  
    53.         // Test3  
    54.         // Test6 static 静态代码块3:9  
    55.         // Test4 static 静态代码块3:0  
    56.         // Test6 初始化块  
    57.         // Test4 初始化块  
    58.         /***********************************************************/  
    59.         // System.out.println(Test4.j);// 这个不执行初始化块  
    60.         // Test3  
    61.         // Test6 static 静态代码块3:4  
    62.         // Test4 static 静态代码块3:8  
    63.         // 8  
    64.         /***********************************************************/  
    65.         System.out.println(Test4.b);// 不会初始化Test4,因为b定义在了Test6  
    66.         // Test3  
    67.         // Test6 static 静态代码块3:8  
    68.         // 8  
    69.   
    70.     }  
    71. }  
  • 相关阅读:
    玄学最短路算法——Ex Floyd
    题解 CF785E 【Anton and Permutation】
    题解 P1825 【[USACO11OPEN]玉米田迷宫Corn Maze】
    实现非递归树链剖分
    题解 P3423 【[POI2005]BAN-Bank Notes】
    题解 P3871 【[TJOI2010]中位数】
    【带修改的主席树】理解题解 (P2617 【Dynamic Rankings】题解)
    快速计算高精乘低精---低精优化高精
    了解 yaml文件格式
    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'test.ac_flight' doesn't exist
  • 原文地址:https://www.cnblogs.com/fpcbk/p/9013761.html
Copyright © 2020-2023  润新知