0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么Java中1000==1000为false,而100==100为true呢

数据分析与开发 来源:数据分析与开发 作者:codeceo 2020-11-19 15:51 次阅读

为什么 Java 中“1000==1000”为false,而”100==100“为true? 这是一个挺有意思的讨论话题。 如果你运行下面的代码:

Integera=1000,b=1000; System.out.println(a==b);//1 Integerc=100,d=100; System.out.println(c==d);//2

你会得到

false true

基本知识:我们知道,如果两个引用指向同一个对象,用==表示它们是相等的。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。

因此,后面一条语句也应该是false 。

这就是它有趣的地方了。

如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象

所以事情就成了,所有的小整数在内部缓存,然后当我们声明类似——

Integerc=100;

的时候,它实际上在内部做的是:

Integeri=Integer.valueOf(100);

现在,如果我们去看valueOf()方法,我们可以看到

publicstaticIntegervalueOf(inti){ if(i>=IntegerCache.low&&i returnIntegerCache.cache[i+(-IntegerCache.low)]; returnnewInteger(i); }

如果值的范围在-128到127之间,它就从高速缓存返回实例。

所以…

Integerc=100,d=100;

指向了同一个对象。

这就是为什么我们写

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

我们可以得到true。

现在你可能会问,为什么这里需要缓存?

合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。

然而,通过反射API你会误用此功能。

运行下面的代码,享受它的魅力吧

publicstaticvoidmain(String[]args)throwsNoSuchFieldException,IllegalAccessException{ Classcache=Integer.class.getDeclaredClasses()[0];//1 FieldmyCache=cache.getDeclaredField("cache");//2 myCache.setAccessible(true);//3 Integer[]newCache=(Integer[])myCache.get(cache);//4 newCache[132]=newCache[133];//5 inta=2; intb=a+a; System.out.printf("%d+%d=%d",a,a,b);// }

责任编辑:xj

点赞和在看就是最大的支持

原文标题:为什么 Java 中“1000==1000”为false,而”100==100“为true?

文章出处:【微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102989
  • C语言
    +关注

    关注

    180

    文章

    7528

    浏览量

    128434

原文标题:为什么 Java 中“1000==1000”为false,而”100==100“为true?

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    1000兆网线和100兆网线压线区别大吗

    1000兆网线和100兆网线在压线方面存在一些差异,但具体差异大小取决于网线的类型和制作工艺。 首先,1000兆网线通常采用的是六类网线或超五类网线,而100兆网线则常使用的是五类网线
    的头像 发表于 04-02 10:22 106次阅读

    如何正确地同时设置DQ32bit和useSpitrue

    请问如何正确地同时设置DQ32bit和useSpitrue,谢谢
    发表于 02-27 07:24

    使用ADAS1000遇到的问题求解答

    以波形的形式显示,与模拟器发出来的波形相对比,明显不同。模拟器发出的波形的QRS是向上的波形,0x11数据波形QRS波形是向下的波形。 4、AC leadoff检测不到导联脱落,呼吸阻抗检测幅值
    发表于 12-20 08:14

    用STM32和ADAS1000通信,在初始化配置的时候需要把ADAS1000配置从模式吗?

    我用STM32和ADAS1000通信,请问我在初始化配置的时候需要把ADAS1000配置从模式吗?
    发表于 12-20 06:03

    用STM32和ADAS1000通过SPI通信,配置DRDY引脚外部下降沿中断,为什么读不出来数据?

    我用STM32和ADAS1000通过SPI通信,配置DRDY引脚外部下降沿中断,为什么读不出来数据,用示波器监测DRDY引脚一直低电平。但是我不用外部中断,而是在“while(1)
    发表于 12-19 08:04

    为什么1000base-T1在mdi上传输频率750MHz

    车载以太网在数据发送过程的编码,4b-3b-2t-pam3。其中在3b-2t的时候,导致频率降为原来的2/3,所以100base-T1的mdi传输频率66.7MHz;对于1000b
    发表于 12-13 11:24

    ad7124-8配置激励电流1000微安,但是实际输出只有880微安怎么解决?

    在IO_Control1寄存器配置冷端的激励电流1000微安,但是用示波器测量只有880微安; 当这个电流流过2K的电阻时产生的电压达不到预期的2000Mv, 请问这个问题怎么解决? 如果在软件
    发表于 12-11 08:02

    ADAS1000如何配置呼吸测量?

    ); //使能传输转换数据流[td]ADAS1000WriteRegister(ADAS1000_FRAMES, 0x40000000); 采集到的心电信号如下: 但呼吸信号始终不对,在帧控制
    发表于 12-11 06:18

    LTC2984将RTD配置热电偶的冷端时,无法得到正确的结果是什么原因

    您好!我最近在做一个热电偶的测量系统,采用LTC2984。用RTD(PT1000)作为冷端补偿,在测量过程遇到了麻烦:直接对RTD测量时可以得到正确的结果。将RTD配置热电偶的冷端时,无法得到
    发表于 12-06 07:48

    100/1000BASE-T1千兆车载以太网转换器

    ZQWL-AE101K是一款千兆车载以太网(100/1000BASE-T1)到 RJ45普通以太网(100/1000BASE-TX)的转接器。该设备实现了普通以太网和千兆车载以太网的物
    的头像 发表于 10-31 17:35 462次阅读
    <b class='flag-5'>100</b>/<b class='flag-5'>1000</b>BASE-T1千兆车载以太网转换器

    龙芯2K1000开发板加载PMON镜像

    ://192.168.1.38/gzrom-dtb.bin,其中 192.168.1.38 虚拟机 Ubuntu 的 IP 地址,如下图所示 烧写完成后重启开发板 PMON 即可更新成功。 更多文档可以查看 B站搜索-北京迅2K1
    发表于 10-24 10:58

    说一下PT100、PT1000电桥测温方案

    今天说一下PT100、PT1000测温方案,我们采用的是电桥测温方案
    的头像 发表于 10-18 14:26 2483次阅读
    说一下PT<b class='flag-5'>100</b>、PT<b class='flag-5'>1000</b>电桥测温方案

    LAN7801:具有RGMII的高性能USB 3.1 Gen 1转10/100/1000以太网控制器

    电子发烧友网站提供《LAN7801:具有RGMII的高性能USB 3.1 Gen 1转10/100/1000以太网控制器.pdf》资料免费下载
    发表于 09-25 15:01 2次下载
    LAN7801:具有RGMII的高性能USB 3.1 Gen 1转10/<b class='flag-5'>100</b>/<b class='flag-5'>1000</b>以太网控制器

    NANO100为何在没有设置ISPCON的APUEN位1的情况下也能擦出和并写入FLASH存储器

    样机却不能保存经过修改后的参数。 2、经过排查程序后,我们在程序设置ISPCON的APUEN位1后,3台样机均能正确保存经过修改后的参数。 所以在此想问一问,这个是不是NANO100芯片内部的BUG
    发表于 08-24 08:20

    1000V电压,10欧姆电阻,电流电流为什么不是100A(pspice仿真,使用IGBT开关)

    IGBT导通后,电源1000V,电阻100Ω,仿真出电路电流10A(如图1、图2),这个没问题。但电源1000V,电阻10Ω,仿真出电流为什么不是100A(如图3、图4)?是IGBT引
    发表于 05-25 11:47