《手册》详解 第2节学员提问之 ==150问题解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 《手册》详解 第2节学员提问之 ==150问题解析


一、背景
码出规范:《阿里巴巴Java开发手册》详解 专栏刚发布, 其中 “第二节 02 Integer缓存问题分析”讲到:

Integer var = ? 形式声明整型,最终会通过 java.lang.Integer#valueOf(int) 来构造整数对象。

有一个学员提出了断点时出现  i =255问题,在另外一篇文章作了分析:https://dwz.cn/m1of2kIu

又有一个朋友发了另外一个类似的问题:

public static void main(String[] args) {
    Integer c = 150;
    System.out.println(c==150);
}

相信学过本专栏的同学可以快速解决这个问题。

二、问题分析
2.1  JLS 大法
根据 JLS 可知,整数对象和整数数值通过 == 比较时,会自动拆箱,比较的是数值。

If r is a reference of type Integer, then unboxing conversion converts r into r.intValue()

2.2 反汇编大法
假装我们不知道 JLS的规定,我们可以通过反汇编大法来查看。

public class com.imooc.basic.learn_int.IntegerTest {
  public com.imooc.basic.learn_int.IntegerTest();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: sipush        150
       3: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       6: astore_1
       7: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
      10: aload_1
      11: invokevirtual #4                  // Method java/lang/Integer.intValue:()I
      14: sipush        150
      17: if_icmpne     24
      20: iconst_1
      21: goto          25
      24: iconst_0
      25: invokevirtual #5                  // Method java/io/PrintStream.println:(Z)V
      28: return
}

核心逻辑:

看到行数为 17的地方,将 intValue 和 150 整数值比较,如果不相等跳转到 24行,

24行将常量0入栈 (虚拟机中用0 可以表示false),然后调用参数为 boolean类型(Z)的打印语句打印,。

如果相等,继续执行到20行,将常量1入栈,然后调用参数为 boolean类型(Z)的打印语句。

反向翻译成 Java源代码大致如下:

public static void main(String[] args) {
    Integer c = 150;
    if(c.intValue() == 150){
        System.out.println(true);
    }else{
        System.out.println(false);
    }
}

因此答案就非常显而易见了。

在这里希望大家能够自主学习  《Java虚拟机规范》,反汇编后能够有自行脑补出对应的Java代码的能力。

Java语言手册和虚拟机手册官方版下载:https://docs.oracle.com/javase/specs/index.html

大家如果看英文吃力,也可以自行购买中文翻译版。

2.3 代码调试法
我们可以在构造方法上和valueOf上打断点,看看来自自己源码调用时 参数为150的调用有几次,可以观察到只有一次。

另外我们还可以查看内存中构造的值为 150的整数对象个数。

可以从右下角的 memory 选项卡中搜索 Integer ,然后双击后使用表达式  equals(150)来查看,值为 150的整数对象,最后发现就一个。

image.png

因此第二个 150并没有转成整数对象。

建议大家可以掌握这种查看内存对象的方法,当没有声明引用时无法通过变量窗口查看时,可以采用此方法核实。

专栏后续的代码调试小节将讲述如异常断点,远程调试等更多调试技巧。

三、总结
1 通过《《手册》详解 第2节学员提问之断点 i=255问题解析 》 和本小节,大家可以发现,记忆知识容易遗忘,而方法才是通用的,掌握常见的经典的好方法可以用来解决很多同类的问题。

2 希望大家以后可以养成分析问题的习惯,遇到类似问题时可以快速解决,而不是搜索各种博客,询问别人。

希望大家能够自主学习,知其然又知其所以然。

3 专栏还会介绍更多学习和排错技巧,感兴趣的同学可以关注专栏。链接:https://dwz.cn/2GIxxC9n

相关文章
1Integer 缓存问题分析

2《手册》详解 第2节学员提问之断点 i=255问题解析 

相关文章
|
编解码 Dubbo 应用服务中间件
Alibaba开源Dubbo源码解析手册,竟引领出RPC的新潮流
前言 Apache Dubbo,一款由阿里巴巴于2011年开源的高性能Java RPC框架,自开源以来在业界产生了深远影响。有大量公司广泛使用,甚至很多公司的自研RPC框架中都能看到Dubbo的影子。Dubbo在国内服务化体系演进过程中扮演了重要角色。尽管经历了几年的沉寂,但在阿里巴巴重启对Dubbo的开源维护,Dubbo正在从微服务领域的高性能RPC框架逐步演变为一个完整的微服务生态。 对于开发者来说,深入了解Dubbo底层的架构设计和实现是一项挑战。因此,一份完整的、体系化的对Apache Dubbo进行深入原理剖析的手册就显得尤为重要。
|
消息中间件 Java 关系型数据库
爆冷门!阿里P8的这份高性能Java架构核心原理解析手册又被吹爆了
市面上讲Java框架的书很多,包括Sping Boot、Spring Cloud、Kafka等,但这些书通常只会让你技术的“量”增长,而“质”仍处于SSM的阶段。而且互联网上并没有体系化、结构化的提升技术的“质”的教材,于是我行动了起来,将我所学的架构思想与实现方式都放入本书中,将提升技术的“质”的方式分享给大家。
103 0
|
20天前
|
图形学 开发者
【Unity光照艺术手册】掌握这些技巧,让你的游戏场景瞬间提升档次:从基础光源到全局光照,打造24小时不间断的视觉盛宴——如何运用代码与烘焙创造逼真光影效果全解析
【8月更文挑战第31天】在Unity中,合理的光照与阴影设置对于打造逼真环境至关重要。本文介绍Unity支持的多种光源类型,如定向光、点光源、聚光灯等,并通过具体示例展示如何使用着色器和脚本控制光照强度,模拟不同时间段的光照变化。此外,还介绍了动态和静态阴影、全局光照及光照探针等高级功能,帮助开发者创造丰富多样的光影效果,提升游戏沉浸感。
36 0
|
2月前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
【7月更文挑战第12天】Python进阶必学:DFS和BFS图遍历算法。理解图概念,用邻接表建无向图,实现DFS和BFS。DFS适用于查找路径,BFS解决最短路径。通过实例代码加深理解,提升编程技能。
24 4
|
4月前
|
域名解析 缓存 运维
【域名解析DNS专栏】域名解析故障排查手册:常见问题与解决方案
【5月更文挑战第22天】【DNS故障排查手册】解决域名无法解析、速度慢、污染劫持及配置错误问题。检查网络、清理缓存、更换DNS服务器、使用HTTPS、DNSSEC及CDN。示例:使用nslookup查询域名解析。定期检查优化DNS服务器,确保稳定安全。
908 4
【域名解析DNS专栏】域名解析故障排查手册:常见问题与解决方案
|
3月前
|
存储 编译器 程序员
【C++高阶】C++继承学习手册:全面解析继承的各个方面
【C++高阶】C++继承学习手册:全面解析继承的各个方面
38 1
|
4月前
|
弹性计算 Ubuntu Linux
2024年Palworld/幻兽帕鲁服务器自建手册:详细步骤解析与设置指南
爆款游戏《幻兽帕鲁》是很多玩家在与好友开黑时的首选,因为《幻兽帕鲁》有着十分丰富的游戏内容,玩家在联机游玩《幻兽帕鲁》时能够获得非常多的快乐。 但在《幻兽帕鲁》进行联机时,是需要自行搭建服务器的,下面就带来,最新《幻兽帕鲁》服务器设置全步骤大全,方便玩家更好的进行联机游玩。 以下就是幻兽帕鲁服务器自建:幻兽帕鲁服务器设置全步骤大全的相关内容。
101 3
|
10月前
|
缓存 监控 架构师
价值32k!阿里顶级架构师深度解析SpringBoot进阶原理实战手册
在当下的互联网应用中,业务体系日益复杂,业务功能也在不断地变化。以典型的电商类应用为例,其背后的业务功能复杂度以及快速迭代要求的开发速度,与5年前的同类业务系统相比,面临着诸多新的挑战。这些挑战中核心的一点就是快速高效地实现系统功能,同时保证代码持续可维护,这是一个非常现实且亟待解决的问题。
|
12月前
|
Go
Go语句与表达式深度解析:全案例手册
Go语句与表达式深度解析:全案例手册
54 0
|
域名解析 缓存 网络协议
【计网修炼手册】五层协议-5应用层-DNS
《计算机组成原理》、《数据结构与算法》、《操作系统》、《计算机网络》不仅是大学信息科学与工程学院的核心课程,也是计算机考研专业基础综合408的考试内容。学习这些内容可能不见得像学习Java和GO一样能让你迅速找到工作,但他们作为计算机世界的基石是需要认真掌握的,这些知识是源源不断的技术浪潮中不会被淘汰的知识。
170 0

热门文章

最新文章

推荐镜像

更多