为什么你写的代码有时候和预期不一致

简介: 为什么你写的代码有时候和预期不一致

为什么你写的代码有时候和预期不一致

一.友情链接

目录
视频讲解
文字版

二.前端编译

2.1javac编译器

即一般所说的编译,从javac代码的总体结构来看,编译过程大致可以分为1个准备过程和3个处理过程,它们分为
1)准备过程:初始化插入式注解处理器
2)解析与填充符号表过程,构造抽象语法树
3)插入式注解处理器的注解处理过程
4)分析与字节码生成过程:语法检查->控制流分析->解析语法糖->字节码生成

语法糖主要有以下几种:泛型、自动拆装箱遍历循环、条件编译
类型擦除(编译前)

public static void main(String[] args) {
    Map<String,String> map = new HashMap<String,String>(16);
    map.put("name","csx-mg");
    String name = map.get("name");
    System.out.println(name);
}

类型擦除(编译后)

public static void main(String[] args) {
    //类型擦除
    Map map = new HashMap();
    map.put("name", "csx-mg");
    //强制转换
    String name = (String)map.get("name");
    System.out.println(name);
}

例如如下代码不可编译


public static void method(List<String> list){
    }

    public static void method(List<Integer> list){

    }

自动拆装箱

Integer a= 200;
Integer b = 200;
System.out.println(a==b);

输出为false

三.后端编译

3.1即时编译器

首先主流的java虚拟机同时包含解释器与编译器,这样可以保证同时使用两者的优点。
热点代码会被编译成本地代码,主要针对方法和被多次执行的循环体,这里还会触发一个有意思的现象栈上替换
主要有两种热点代码采集方式:基于采样的热点探测、基于计数的热点探测。Hotspot采用了第二种,使用了方法调用计数器(默认10000次)和回边计数器(默认10700)

3.2提前编译器

目的是改善java的启动时间,演变为现在所熟知的JIT
目前也在积极开发更多更优秀的提前编译器,用于匹配新出的一些垃圾回收器

3.3编译优化

1.最重要的优化:方法内联:把目标方法的代码原封不动地“复 制”到发起调用的方法之中,避免发生真实的方法调用。
2.最前沿的优化:逃逸分析:栈上分配(对象往栈上分配)、标量替换(大对象拆成基础数据类型)、同步消除(消除无用的线程同步)
3.最经典的优化:公共子表达式消除(例如 a=1和b=1先后执行顺序并没有区别,可以先执行初始化a,然后所有用到b的地方都替换为a)
4.最显著的优化:无用代码消除
5.java经典优化:数组边界消除检查
1)数组下标是一个常量,如foo[3],只要在编译期根据数据流分析来确定foo.length的值,并判断下标“3”没有越界,执行的时候就无须判断了。
2)数组访问发生在循环之中,并且使用循环变量来进行数组的访问。如果编译器只要通过数据流分析就可以判定循环变量的取值范围永远在区间[0,foo.length)之内,那么在循环中就可以把整个数组的上下界检查消除掉。

if(foo!=null){
    return foo.value;
}else{
    throw new NullPointException
}

3)如果foo几乎不会发生NPE,那么上述方法无疑是浪费了一次判断性能,就会被直接优化成trycatch
其它优化策略:编译器策略、基于性能监控的优化技术、基于证据的优化技术、数据流敏感重写、语言相关的优化技术、内存及代码位置变换、循环变换、全局代码调整、控制流图变换等

相关文章
|
分布式计算 API 调度
【2023总结】天猫国际自营贴纸系统的焕新之路
【2023总结】天猫国际自营贴纸系统的焕新之路
278 3
|
11月前
|
消息中间件 运维 算法
Kafka 为什么要抛弃 Zookeeper?
本文探讨了Kafka为何逐步淘汰ZooKeeper。长久以来,ZooKeeper作为Kafka的核心组件,负责集群管理和协调任务。然而,随着Kafka的发展,ZooKeeper带来的复杂性增加、性能瓶颈及一致性问题日益凸显。为解决这些问题,Kafka引入了KRaft,这是一种基于Raft算法的内置元数据管理方案,不仅简化了部署流程,还提升了系统的一致性和扩展性。本文详细分析了这一转变背后的原因及其带来的优势,并展望了Kafka未来的发展方向。
638 1
|
开发者
【第十四期乘风伯乐奖】获奖名单出炉,快来看看本期谁是社区伯乐!
【第十四期乘风伯乐奖】获奖名单出炉,快来看看本期谁是社区伯乐!
186 7
|
JavaScript 前端开发 UED
深入理解JavaScript中的节流与防抖技术
理解并合理运用节流与防抖技术,可以帮助我们优化事件处理函数的执行频率,从而提升应用的性能和用户体验。这两种技术通过减少不必要的计算和DOM操作,使得Web应用程序能够更加流畅地运行。 通过掌握防抖和节流的实现原理及应用场景,开发者可以更加灵活地编写高效且性能优化的代码,对于面对高频事件处理时尤其重要。在开发中合理选择使用防抖或节流,将直接影响到应用的响应性和效率。
154 1
|
C++
C++程序标准输出流
C++程序标准输出流
114 1
|
12月前
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
100 11
|
12月前
在FlashFXP中设置数据传输模式为PORT(主动模式)的两种方法
在FlashFXP中设置数据传输模式为PORT(主动模式)的两种方法
|
JSON 数据安全/隐私保护 数据格式
用户登录权限校验 JWT【详解】
用户登录权限校验 JWT【详解】
404 1
|
SQL 前端开发
IDEA+SSM+SpringBoot+Vue+Element UI实现班级管理增删改查
IDEA+SSM+SpringBoot+Vue+Element UI实现班级管理增删改查
417 0
IDEA+SSM+SpringBoot+Vue+Element UI实现班级管理增删改查
|
存储 缓存 索引
【操作系统】第四章:非连续内存分配(Part2:页表)
【操作系统】第四章:非连续内存分配(Part2:页表)
459 0