`

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

阅读更多

周志明先生所著的《深入理解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));//

 

}

分享到:
评论

相关推荐

    springboot_笔记

    ### Spring Boot 学习笔记概览 #### 一、Spring 的发展历程 1. **Spring 1.x 时代** - 在Spring框架发展的初期(即Spring 1.x时代),主要采用XML文件来进行bean的配置。这种方式简洁且易于理解,但随着项目的...

    Java笔记---李兴华

    尽管随着智能手机和Android的兴起,JAVAME逐渐淡出主流市场,但它在早期移动应用开发领域仍然发挥了重要作用。 #### 三、Java语言特点 1. **简单易学**:Java语言设计简洁明了,易于理解和学习。 2. **面向对象**...

    笔记 — JVM内存结构

    - 局部变量表存储编译期已知的基本类型、对象引用。64位的long和double类型占据两个局部变量槽,其他类型占据一个。 - 操作栈在方法执行过程中用于临时存储数据,执行字节码指令。 - 动态链接将符号引用转换为...

    计算机等级考试三级网络技术复习提纲

    - **大型机阶段**:早期计算机的发展时期,通常用于大规模的数据处理任务,如政府、军队及大型企业的数据处理。 - **四个小阶段**:随着技术进步,大型机经历了多次迭代升级,逐渐提高性能和减少体积。 - **小型机...

    CTS-seminar-1081-Vlaicu-Elena

    这个研讨会的名称可能指的是一个特定的主题或者项目编号,如CTS(可能是“计算机技术研讨会”或“持续技术学习”等)的第1081期活动。 【描述】描述部分并没有提供额外的具体信息,可能是因为它是重复的标题,或者...

Global site tag (gtag.js) - Google Analytics