奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?

CCF201803-2 碰撞的小球 python 一些话:已经不知道是第几次做这道题了(大概第三次吧),真的常做常新,每次都有新的细节想法。虽然方法简单粗暴,但好在方便理解,对于我这种菜鸟选手而言。 但在做的过程中,最开始还忽略了输入的小球初始位置有可能是无序的,输出的时候要保持相对位置。CCF真的考验细节,希望上考场时能够认真仔细一点。就酱… #碰撞的小球 #当小球坐标为0或L时,会朝相反方向移动 #当两个小球坐标相等时,会分别转向相反的方向 #计算t秒之后小球的位置 n,L,t = map(int,input().split()) location . 阅读详情

这是我们今天要讨论的话题,因为我觉得它非常的有趣。

如果你运行如下代码:

1
2
3
4
Integer a = 1000, b = 1000;
System.out.println(a == b);//1
Integer c = 100, d = 100;
System.out.println(c == d);//2

你会得到以下运行结果:

1
2
false
true

我们知道,如果两个引用指向同一个对象,那么==就成立;反之,如果两个引用指向的不是同一个对象,那么==就不成立,即便两个引用的内容是一样的。因此,结果就会出现false。

这是非常有趣的地方。如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。

这个东西为那些数值比较小的整数提供内部缓存,当进行如此声明时:

1
Integer c = 100;

它的内部就是这样的:

1
Integer i = Integer.valueOf(100);

如果我们观察valueOf()类函数,我们可以看到

1
2
3
4
5
public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i
          return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
    }

如果值在-128到127之间,它就会返回该缓存的实例。

因此。。。

1
Integer c = 100, d = 100;

两者指向同样的对象。

这就是为什么这段代码的结果为true了:

1
System.out.println(c == d);

现在你可能会问,为什么会为-128到127之间的所有整数设置缓存?

这是因为在这个范围内的小数值整数在日常生活中的使用频率要比其它的大得多,多次使用相同的底层对象这一特性可以通过该设置进行有效的内存优化。你可以使用reflection API任意使用这个功能。

运行下面的这段代码,你就会明白它的神奇所在了。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
 
      Class cache = Integer.class.getDeclaredClasses()[0]; //1
      Field myCache = cache.getDeclaredField("cache"); //2
      myCache.setAccessible(true);//3
 
      Integer[] newCache = (Integer[]) myCache.get(cache); //4
      newCache[132] = newCache[133]; //5
 
      int a = 2;
      int b = a + a;
      System.out.printf("%d + %d = %d", a, a, b); //
    }
一文讲透 SAP SD:把报价、订单、交付、开票串成一条可落地的业务闭环 摘要:SAP SD(销售与分销)模块是企业O2C(订单到收款)流程的核心,管理从客户意向到回款的完整链路。该模块围绕销售订单、交付、开票等关键环节,与财务、物料管理等模块深度集成。SD的核心在于主数据管理、单据驱动流程、定价规则引擎和信用风控,通过条件技术实现复杂定价策略,并支持多维度分析。典型应用场景包括多渠道销售企业的价格体系管理、信用控制和物流协同,有效解决销售与交付脱节、财务对账困难等业务痛点。(149字) 阅读详情

相关推荐

Aras Innovator生命周期图实战:从配置到权限管理的全流程解析

本文详细解析了Aras Innovator生命周期图的全流程配置与权限管理,从基础概念到实战应用,涵盖状态设置、路径配置、权限控制等核心功能。通过实际案例和代码示例,帮助用户掌握如何高效管理数据生命周期,提升业务流程的规范性和效率。

ee345的博客 167

为什么1000==1000返回false,100==100返回true?

这可能是个讨论得较多的话题,但是我觉得它很有趣:为什么1000==1000返回false,100==100返回true?public static void main(S...

zhupanlinch的博客 589

高通Camera PDAF调试实战:从Type2到Type3的避坑指南与Log分析技巧

本文深入解析高通Camera平台PDAF调试实战,重点对比Type2与Type3的核心差异,提供详细的配置迁移方案和Log分析技巧。针对常见兼容性问题如对焦速度变慢、低光失效等,给出具体解决方案,并分享性能优化案例与高级调试工具链,帮助开发者快速提升PDAF调试效率。

weixin_29164185的博客 408

valueof是什么意思_为什么Java中1000==1000为false,而100==100为true?

这是一个挺有意思的讨论话题。如果你运行下面的代码:Integer a = 1000, b = 1000; System.out.println(a == b);//1 Integer c = 100, d = 100; System.out.println(c == d);//2你会得到false true基本知识:我们知道,如果两个引用指向同一个对象,用 == 表示它们是相等的。如果两个...

weixin_36310396的博客 539

NIDS——suricata(一)

NIDS——suricata环境安装和规则编写

weixin_58666006的博客 1272

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解瞬态薛定谔方程(python)

k8291121的博客 2722

为什么 Java 中“1000==1000”为false,而”100==100“为true?

如果你运行下面的代码: Integer a = 1000, b = 1000; System.out.println(a == b);//false Integer c = 100, d = 100; System.out.println(c == d);//true 总结回答: 因为Integer内部有一个私有类IntegerCache,它缓存了从 - 128 到 127 之间的所有的整数对象。如果值的范围在 - 128 到 127 之间,它就从高速缓存返回实例。为什么需要缓存?合乎逻辑的理由是

u013343616的博客 397

【ESP32设备通信】-LoRaWAN网关

在物联网 (IoT) 时代,连接设备和收集数据变得比以往任何时候都更加容易和重要。 LoRaWAN(远程广域网)技术已成为远程、低功耗物联网通信的强大解决方案。 在本教程中,我们将使用 ESp32 构建 LoRaWAN 网关电路,并使用 ESP32 和 BME280 传感器构建传感器节点电路。 对于这两个电路,我们将使用基于 SX1278 (Ra-02) LoRa 模块在设备之间进行无线通信。 我们还将向您展示如何将传感器数据传输到流行的物联网平台 ThingSpeak。

视觉与物联智能 1580

(转)奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?

来源:回忆和感动 链接:evget.com/article/2015/11/19/23028.html 这是我们今天要讨论的话题,因为我觉得它非常的有趣。 如果你运行如下代码: 1 2 3 4 Integer a = 1000, b = 1000;  System.out.println(a == b);//1 Integ

BINGO的博客 360

玩转Docker小游戏项目系列: Docker部署红心纸牌网页小游戏

玩转Docker小游戏项目系列: Docker部署红心纸牌网页小游戏

jks212454的博客 420

黑猫带你学eMMC协议第9篇:eMMC初始化过程(initial)

本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 文章所在专栏:《黑猫带你学:eMMC协议详解》 1 什么是emmc的初始化 对于小白来说,可能不太明白什么是emmc初始化。举个栗子:当你拿到一个电脑,接上电源,是不是就立马可以用了呢?并不是吧,你还需要去开机,等待电脑启动,配置完各种参数,等出现了电脑桌面,你才能用。那么同样,对于emmc芯片来说,也不是提供电源就能用了,需要输入各种命令后,让其进入到tran state后,才能正.

黑猫奥利奥的博客 6737

为什么在Java中使用Integer,1000==1000是false,而100==100是true?

为什么在Java中使用Integer,1000==1000是false,而100==100是true?

未知的希望,是我不灭的信仰 905

医学图像的对抗攻击:模型安全性与鲁棒性分析

医学图像的对抗攻击:模型安全性与鲁棒性分析 ,人工智能,计算机视觉,大模型,AI,本文围绕医学图像的对抗攻击展开,分析了其对AI模型的威胁。介绍了对抗样本定义、攻击原理,以及FGSM、BIM、PGD等常见攻击方法,还给出了相关代码示例。阐述了攻击对模型诊断准确性和可信度的影响,提出对抗训练、输入预处理、模型集成等提升模型安全性与鲁棒性的方法,探讨了评估指标、数据集和流程,分析了实际应用中的挑战与应对策略,最后展望了未来发展趋势。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

奇怪的Java题:为什么128 == 128返回为False,而127 == 127会返回为True?

这是我们今天要讨论的话题,因为我觉得它非常的有趣。如果你运行如下代码:class A { public static void main(String[] args) { Integer a = 128, b = 128; System.out.println(a == b); Integer c = 127, d = 127;

http://www.54tianzhisheng.cn/ 6689

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

奇怪的Java题 Integer a = 1000, b = 1000; Integer c = 100, d = 100

奇怪的Java题: Integer a = 1000 , Integer b = 1000; Integer c = 100;Integer d = 100 为什么a== b返回为False,而c == d会返回为True 因为 Integer.java类,是Integ...

chuangshulun6975的博客 1110

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

奇怪的知识又增加了,为什么“100==100“为true,“1000==1000“为false?

具体来说,当我们初始化一个Integer对象时,Java会根据具体情况进行优化,将一些相同的值指向相同的对象。因此,当我们声明和初始化a和b时,它们都被赋予了100,它们将指向常量池中的同一个对象。在本例中,c和d都是超出Integer对象常量池的范围的,因此它们指向不同的对象。尽管它们的值相等,但它们在内存中的位置不同。因此,使用“==”运算符比较两个对象时,它们将被认为是不同的。当我们使用equals()方法时,它将比较对象的值,而不是它们的引用,因此无论值在内存中的位置如何,它们将被认为是相等的。

weixin_44403358的博客 261

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java integer 1000_奇怪的Java题 Integer a = 1000, b = 1000; Integer c = 100, d = 100

奇怪的Java题:Integer a = 1000 , Integer b = 1000;Integer c = 100;Integer d = 100为什么a== b返回为False,而c == d会返回为True因为 Integer.java类,是IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。例:Integer c = 100;它的内部就是...

weixin_28870939的博客 410

JAVA 两个Integer 中1000==1000为false而100==100为true?

这个问题刚遇见的时候很是奇怪,先贴上测试代码 public class SOlution { public static void main(String[] args){ Integer a=1000; Integer b=1000;    System.out.println(a==b);    Integer a1=100; Integer b1=100;    System

学习学习再学习 1798
上一篇: java8的新特性
下一篇: 常见数据结构与算法整理总结(下)
R先森
博客等级 码龄12年 193粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值