`

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

阅读更多

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

 

}

分享到:
评论

相关推荐

    编译原理课堂笔记 史上最详细 最牛逼的编译笔记

    因此,为了帮助初学者更好地掌握这门课程,一套“史上最详细、最牛逼的编译原理课堂笔记”应运而生,它以细致入微的态度和清晰的结构,对编译原理进行了全面的剖析。 首先,笔记从编译程序的基本概念讲起,简明扼要...

    mysql优化笔记+资料

    以下是一份详细的MySQL优化笔记,涵盖了多个方面: 一、查询优化 1. 使用索引:为经常用于搜索的列创建索引可以显著加快查询速度。B树和哈希索引是最常见的类型,适用于不同的查询场景。 2. 避免全表扫描:尽量使用...

    凸优化笔记复习期末考试精简

    这份"凸优化笔记复习期末考试精简"资料,应该是为了帮助学生准备期末考试而整理的精华内容,涵盖了凸优化的基本概念、理论和应用。 首先,我们来了解一下凸集和凸函数的概念。在欧几里得空间中,如果集合内的任意两...

    凌青凸优化笔记1

    凸优化是优化理论中的一个重要分支,它主要研究的是在满足一定约束条件下的凸函数最小化问题。凸优化在数学、工程、经济等多个领域都有广泛的应用,例如数据拟合、控制系统设计、能源管理、图像处理等。 1. **凸...

    斯坦福大学cs231n课堂笔记翻译 最优化笔记

    斯坦福大学CS231n课程中的最优化笔记涵盖了深度学习中寻找最优参数集的过程,这是通过最小化损失函数来实现的。损失函数是衡量模型预测与实际数据之间不一致程度的一种方式,其目的在于通过调整参数来减少预测误差。...

    0058-极智AI-解读tvm使用tvmc来编译和优化模型-个人笔记

    0058_极智AI_解读tvm使用tvmc来编译和优化模型-个人笔记

    mysql优化笔记.doc

    5. **存储过程**:模块化编程,可以预先编译并多次执行,提高执行速度,减少网络传输。 6. **MySQL配置优化**: - **调整最大并发数**:在my.ini配置文件中设置`max_connections`,控制同时连接的客户端数量。 - ...

    C语言-编译预处理_笔记

    - **性能优化**:为了避免重复包含同一个文件,可以在文件头部使用`#ifndef`/`#define`/`#endif`来防止重复包含。 - **查找策略**:使用双引号时,优先级从高到低为当前目录 -&gt; 系统路径;使用尖括号时,优先级为...

    linux优化笔记

    操作系统级 CPU 目前大部分CPU在同一时间只能运行一个线程,超线程的处理器可以在同一时间处理多个线程,因此可以利用超线程特性提高系统性能。 在linux系统下只有运行SMP内核才能支持超线程,但是安装的CPu数量越...

    编译原理笔记个人手写整理.pdf

    "编译原理笔记个人手写整理.pdf" 本资源是关于编译原理笔记的个人手写整理,涵盖了编译原理的基本概念、算符优先关系、算符优先分析算法、优先函数、LR 分析法等多个方面的知识点。 一、算符优先关系 算符优先...

    MySQL优化笔记-整理版

    里面结合了我整理的笔记希望对大家有用,请大家多多支持

    凸优化理论笔记.zip_凸优化_凸优化笔记

    这份"凸优化理论笔记.zip"包含了深入理解和掌握凸优化所需的关键概念与技巧。 首先,我们需要了解凸函数的基本概念。一个函数如果在其定义域内,任意两点连线上的所有点的函数值都小于等于这两点的函数值,那么这个...

    最优化理论笔记.pdf

    ### 最优化理论与凸优化知识点总结 #### 一、最优化理论概述 ...以上是对“最优化理论笔记”中关键知识点的概括总结。这些知识点覆盖了从基础概念到高级理论的各个方面,对于理解和应用最优化理论具有重要意义。

    优化笔记 v1.0

    优化笔记为一款小型绿色软件,可以自由拷贝到任何机器上使用,所用数据库为Access,您可以通过按装微软Office办公软件里的Aceess自由打开查看修改复制里面的数据,无需担心你的日记被破坏或丢失。数据库存放在软件根...

    哈工大编译原理复习笔记

    哈工大编译原理复习笔记

    小红书信息流笔记优化指引(带商详).pdf

    小红书信息流笔记优化指引(带商详) 作为小红书信息流笔记优化指引(带商详),本文档旨在帮助品牌商家和内容创作者更好地理解小红书平台的信息流笔记优化策略,提高品牌曝光率、粉丝数和转化率。本文档将从信息流...

    最优化,stanford凸优化课堂笔记,简单易懂

    非常好的笔记,简单易懂,比书上写的简单,适合初学。

    最优化笔记.pdf

    最优化笔记.pdf 本文档是一份关于最优化笔记的pdf文档,包含了最优化笔记的整理、凸函数的判定、一阶条件、二阶条件、线性规划、整数规划、动态规划、对偶理论、灵敏度分析等方面的知识点。 一、凸函数的判定 凸...

Global site tag (gtag.js) - Google Analytics