经典面试题:Integer c=100,d=100,c==d 一定是false吗?

Keil MDK-ARM v5.43a 部署 STM32F103 开发环境全流程 嵌入式开发环境是 Cortex-M 微控制器工程落地的基础支撑,其核心在于编译器链、设备支持包(DFP)与调试驱动的协同一致性。Keil MDK-ARM 作为工业级 ARM Cortex-M 开发套件,依托 Arm Compiler 和 CMSIS 标准,提供从代码编译、外设抽象到实时调试的全栈能力。其技术价值体现在对 STM32 等主流 MCU 的深度适配、高可靠性 SWD 调试支持,以及与 HAL 库、CubeMX 工程的无缝集成。典型应用场景涵盖温湿度传感终端、工业 PLC 子模块及低功耗边缘节点开发 阅读详情

相信大家在面试的过程中可能都遇到过这样一道题吧!

public static void main(String[] args) {
        Integer a = 1000,b = 1000;

        Integer c = 100,d = 100;

        System.out.println(a == b);
        System.out.println(c == d);
    }

相信大家得出的答案都是 false true
但是在这里我一定要说,这个答案不是绝对的 cd 一定是true,但是ab 却不一定就是false ,也有可能是true。
在这里插入图片描述
但是我得到的值是 true,true 如果不相信的同学或者抱有怀疑的同学请往下看!

我们首先要明白 通常情况下为什么答案会是 false,true。

Integer c = 1000 实际在内部做了Integer c = Integer.valueOf(100)的操作。我们来看一下Integer.class的源码。

/**
     * Returns an {@code Integer} instance representing the specified
     * {@code int} value.  If a new {@code Integer} instance is not
     * required, this method should generally be used in preference to
     * the constructor {@link #Integer(int)}, as this method is likely
     * to yield significantly better space and time performance by
     * caching frequently requested values.
     *
     * This method will always cache values in the range -128 to 127,
     * inclusive, and may cache other values outside of this range.
     *
     * @param  i an {@code int} value.
     * @return an {@code Integer} instance representing {@code i}.
     * @since  1.5
     */
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

从上面的代码中可以看到,当i >= IntegerCache.low && i <= IntegerCache.high的时候会从cache数组里直接取值,否则new一个新的Integer对象。

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

从上面的Integer.class源码中 可以看出,low的默认值是-128,high的值与integerCacheHighPropValue有关,

String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

当我们未对vm中的Integercache进行设置的时候其莫认真是127,cache数组也就是从-128到127,这也就不难理解为什么。
在开文时提到的经典面试题的结果会是false 和 true,之所以我后面强调不一定,就是因为当ntegerCacheHighPropValue不为null的时候取决于jvm中的设置,

在eclipse中我们可以做这样的操作:
在这里插入图片描述
这时候再来执行那段代码,你就会得到结果是 true和true,下次谁再问你这样的问题,可以大声的告诉他不一定,实力装13一波!

来源:https://sourl.cn/PsR8Kv

十分钟学会排查线上JVM溢出 设置最大最小内存均为200mb为了快速OOM。 阅读详情

相关推荐

Cache一致性协议详解——从MSI到Directory-Based

摘要 《深入浅出多核 Cache 一致性协议》系统梳理了从 MSI 到 Directory-Based 的缓存一致性协议演化历程。文章从计算机存储体系结构出发,阐释了多核环境下缓存一致性问题产生的根源:为解决"存储墙"问题引入的多级缓存导致同一数据存在多个副本。随后详细分析了两种主流解决方案——基于总线监听的 Snooping 协议(包括 MSI、MESI、MESIF、MOESI 等)和基于目录的 Directory-Based 协议,对比了它们在扩展性、带宽消耗等方面的优劣。文章特别对各类协议的状态转换机

元直的博客 18

经典面试题Integer c=100,d=100 c==d 一定是false

相信大家在面试的过程中可能都遇到过这样一道题吧! public static void main(String[] args) { Integer a = 1000,b = 1000; Integer c = 100,d = 100; System.out.println(a == b); System.out.println(c == d); } 相信大家得

qq_36680439的博客 1987

2、Elixir与Erlang:构建高可用系统的利器

本文介绍了Elixir与Erlang在构建高可用系统方面的优势,深入探讨了Erlang的并发机制、容错能力以及分布式特性,并结合实际应用场景展示了其在服务器端开发中的强大能力。此外,还提供了学习资源和交流平台,帮助开发者快速上手并深入实践。

grape的博客 111

面试题Integer c=100,d=100,c==d 是false吗? 网友:惊呆了。。。

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐点击领取全栈资料:全栈资料相信大家在面试的过程中可能都遇到过这样一道题吧!publicstaticvoidmain(Stri...

全栈开发者社区 175

面试题Integer c=100,d=100,c==d 一定是false吗?

文章来源:https://sourl.cn/PsR8Kv相信大家在面试的过程中可能都遇到过这样一道题吧!publicstaticvoidmain(String[]args){ Integera=1000,b=1000; Integerc=100,d=100; System.out.print...

qq_14958051的博客 143

RocketMQ 同一 JVM 启动多个 Producer 导致 NameServer 只连一个的问题

这个问题本质上不是 NameServer 配置没生效,而是:同一 JVM 下,多个 Producer 因为 ClientId 相同,底层共用了同一个。短期解法如果确实要一个 JVM 连多个 MQ 集群,就为不同 Producer/Consumer 设置不同的。长期解法如果只是集群迁移,直接统一所有到新地址,避免维护多套客户端资源。排查这类问题时,别只看业务代码里的,还要看到底层客户端实例是否被复用了。

阿昌爱Java 310

Linux-JVM线程查询

【代码】Linux-JVM线程查询。

u013578042的博客 44

LangGraph 会话切换与短期记忆管理

本文介绍了使用LangGraph构建Agent应用时的会话记忆管理方案。核心是通过Checkpointer机制实现多轮对话跟踪和会话隔离,重点演示了基于InMemorySaver的内存存储实现方式。文章包含以下要点: 基础会话管理:利用thread_id实现多会话隔离,相同ID复用历史,不同ID创建独立会话 交互式终端实现:通过命令行指令支持会话切换、历史查看和消息清空 记忆系统架构:Checkpointer自动管理会话轨迹,Store用于业务数据存储 开发调试方案:InMemorySaver适合本地测试,

微软技术分享 229

回答问题JVM

对象头包含 Mark Word 与类型指针,Mark Word 保存锁、哈希码、GC 年龄;G1 将堆分为多个 Region,GC 分为初始标记、并发标记、最终标记、筛选回收;依靠 SATB 并发标记,支持可预测停顿,优先回收垃圾最多区域,不易产生内存碎片。CMS 分为初始标记、并发标记、重新标记、并发清除;基础 GC 算法有标记清除、复制、标记整理;类加载分为加载、验证、准备、解析、初始化;new 创建对象首先检查类是否加载,随后在堆分配内存并零值填充,设置对象头,最后执行构造方法完成对象初始化。

qq_40458575的博客 234

CPU 100% 排查实战复盘:4步从确认到根治(附命令)

线上 CPU 100%、服务卡死,重启三次还是烧。很多人本能反应又是硬件不够了、加机器,结果过会儿又满。本文用 4 步法,从确认 CPU 打满到根治,每一步都讲清"为什么这么查",附可直接抄的命令。防汛防台巡检期,机房偏偏怕这种单核被打满的慢病。

ITyunwei0987的博客 209

Java面试题——JVM(二)

Java堆内存中,分代垃圾回收是一种常用的垃圾回收方式。其中,新生代主要负责存储短期存活的对象,老年代则主要存储长期存活的对象。新生代GC、老年代GC和完全GC是三种不同的GC方式,它们的特点如表所示。 JDK预设的垃圾回收器的特点如表所示。 垃圾回收器的性能评估指标如表所示。 在JDK 17中,G1垃圾回收器是默认的垃圾回收器。G1垃圾回收器在JDK 7中首次被引入,并在随后的JDK版本中进行了改进和优化。G1垃圾回收器是一个高效的垃圾回收器,其特点是可以高效地管理大内存、具有可预测的停顿时间和高吞吐

吴声子夜歌的博客 198

大厂Java面试:Spring Boot、JVM、Redis、Kafka与Elasticsearch在内容社区UGC场景下的实战拷问

下一位,谢飞机。”面试官王工翻看着简历,头也不抬地说。谢飞机挺直腰板走进会议室,坐下后紧张地搓了搓手:“面试官好,我叫谢飞机,Java后端开发三年经验,主要做内容社区方向的业务。王工抬眼看了他一下:“三年经验,简历上写了Spring Boot、Redis、Kafka、Elasticsearch这些。那我们直接进入正题,你们社区的核心功能是什么?我们那套系统日活大概五十万,我负责的模块是内容发布和动态流。王工点点头:“行,先从你熟悉的说起。

2602_95996092的博客 191

电商场景Java面试:Spring Boot、JVM、Redis、Kafka、微服务与分布式事务考点解析——谢飞机的作死面试记

谢飞机,你的简历上写着精通Java、Spring、Redis、Kafka,那我们先聊聊电商项目吧。”面试官王工推了推眼镜。谢飞机挺直腰板:“好的,我做过一个电商平台,日活百万。王工点点头:“那你说说Spring Boot的自动装配原理是什么?谢飞机:“自动装配就是……嗯,Spring Boot启动的时候,会根据pom里的依赖自动配置bean,不用我们手动写XML。王工:“不错,那JVM的内存区域有哪些?如果线上OOM你怎么办?谢飞机:“有堆、栈、方法区。OOM就加内存呗,重启应用。

2602_95996092的博客 183

零基础入门Python14|SQLite与SQL CRUD:建立图书数据库

图中最重要的边界是事务:只有成功路径才提交数据,失败路径不能留下半条业务记录。

a1250467048的博客 208

Mission Planner1.3.68.zip

APM飞控地面站安装程序,Mission Planner.msi,平台:Windows环境注意:运行环境需要微软Net Framework 4.0框架,Windows 8以下的版本基本不会自带这个框架,需要先行安装(此为window框架)下载链接:https://www.microsoft.com/zh-CN/download/details.aspx?id=17718

上一篇: Linux 系统下 查找文件 命令总结,这个很哇塞!
下一篇: Linux 系统下 查找文件 命令总结,这个很哇塞!
Ch97CKd
博客等级 码龄9年 1675粉丝 · 274原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值