`

《早期(编译期)优化》笔记

阅读更多

周志明先生所著的《深入理解Java虚拟机:JVM高级特性与最佳实践》(购买地址:亚马逊链接),对我学习Java、理解Java之道有非常大的帮助。至今已读过两遍,为了能够融会贯通,加深记忆(人老了记忆力差),便在Blog上记录一些认为该记的东西。

       

        Java语言的“编译期”是一段“不确定”的过程,因为它可能是指一个前端编译器(如HotSpotjavac)把*.java文件转变成*.class文件的过程;也可能是只虚拟机的后端运行期编译器(Just In Time编译器)把字节码转变成机器码的过程;甚至还可能是指使用静态提前编译器(AOTAhead Of Time编译器)直接把*.java转化为本地机器码的过程。

         对于Javac这类编译器,在编译期对代码的运行效率几乎没有任何优化措施。但是Javac做了许多针对编码过程的优化措施来改善程序员的编码风格和提高编码效率。相当多新生的Java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来支持。可以说,Java中即时编译器(JIT)在运行期的优化过程对于程序运行来说更重要,而前端编译器在编译期的优化过程对于程序编码来说关系更加密切。

 

//TODO javac编译器分析

 

语法糖

         泛型与类型擦除

         泛型是JDK1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说操作的数据类型被指定为一个参数。这中参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。

         泛型技术在C#Java之中的使用方式看似相同,但实现上却有着根本性的分期,C#里面的泛型无论在程序源码中、编译后的IL中还是运行期间的CLR中都是切实存在的,List<int>List<String>就是两个不同的类型,它们在系统运行期生成,有自己的虚方法表和类型数据,这种实现称为类型膨胀,基于这种方法实现的泛型被称为真实泛型。

         Java语言中的泛型则不一样,它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此对于运行期的Java语言来说,ArrayList<Integer>ArrayList<String>就是同一个类。所以泛型技术实际上是Java语言的一颗语法糖,Java语言中的泛型实现方式称为类型擦除,基于这种方法实现的泛型被称为伪泛型。

         代码Map<String,String> map=new HashMap<String,String> ();经过编译成class文件后,将其反编译,可以看到反编译后的代码变为Map map=new HashMap (),泛型类型都变为了原生类型。

 

         自动装箱、拆箱与遍历循环

         这几个是Java语言里面被使用得最多的语法糖。

 

publicstaticvoid main(String[] args) {

       //自动装箱拆箱的陷阱

       Integer a=1;

       Integer b=2;

       Integer c=3;

       Integer d=3;

       Integer e=321;

       Integer f=321;

       Long g=3L;

      

       System.out.println(c==d);//

       System.out.println(e==f);//

       System.out.println(c==(a+b));//

       System.out.println(c.equals(a+b));//

       System.out.println(g==(a+b));//

       System.out.println(g.equals(a+b));//

 

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics