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
    +关注

    关注

    20

    文章

    2990

    浏览量

    112346
  • C语言
    +关注

    关注

    181

    文章

    7633

    浏览量

    142744

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    VIAVI Xgig 1000 32/128G FC和25/50/100GE以太网分析仪介绍

    VIAVI Xgig1000 32/128G光纤通道和25/50/100G以太网平台是可解决具有可重构端口的便携式集成平台中的8G/16G/32G/128G FC和10/25/50/100GE问题的产品
    的头像 发表于 03-21 15:37 ?618次阅读
    VIAVI Xgig <b class='flag-5'>1000</b> 32/128G FC和25/50/<b class='flag-5'>100</b>GE以太网分析仪介绍

    K7815-1000(L) K7815-1000(L)

    电子发烧友网你提供AIPULNION(AIPULNION)K7815-1000(L)相关产品参数、数据手册,更有K7815-1000(L)的引脚图、接线图、封装手册、中文资料、英文资料,K7815-
    发表于 03-20 18:34
    K7815-<b class='flag-5'>1000</b>(L) K7815-<b class='flag-5'>1000</b>(L)

    ADAS1000-4 adi

    电子发烧友网你提供ADI(ADI)ADAS1000-4相关产品参数、数据手册,更有ADAS1000-4的引脚图、接线图、封装手册、中文资料、英文资料,ADAS1000-4真值表,AD
    发表于 03-10 18:40
    ADAS<b class='flag-5'>1000</b>-4 adi

    ADAS1000-1 adi

    电子发烧友网你提供ADI(ADI)ADAS1000-1相关产品参数、数据手册,更有ADAS1000-1的引脚图、接线图、封装手册、中文资料、英文资料,ADAS1000-1真值表,AD
    发表于 03-10 18:39
    ADAS<b class='flag-5'>1000</b>-1 adi

    ADAS1000-3 adi

    电子发烧友网你提供ADI(ADI)ADAS1000-3相关产品参数、数据手册,更有ADAS1000-3的引脚图、接线图、封装手册、中文资料、英文资料,ADAS1000-3真值表,AD
    发表于 03-10 18:38
    ADAS<b class='flag-5'>1000</b>-3 adi

    ADAS1000 adi

    电子发烧友网你提供ADI(ADI)ADAS1000相关产品参数、数据手册,更有ADAS1000的引脚图、接线图、封装手册、中文资料、英文资料,ADAS1000真值表,ADAS
    发表于 03-10 18:37
    ADAS<b class='flag-5'>1000</b> adi

    ADAS1000-2 adi

    电子发烧友网你提供ADI(ADI)ADAS1000-2相关产品参数、数据手册,更有ADAS1000-2的引脚图、接线图、封装手册、中文资料、英文资料,ADAS1000-2真值表,AD
    发表于 03-10 18:37
    ADAS<b class='flag-5'>1000</b>-2 adi

    ADRF6850 100MHz至1000MHz集成宽带接收机技术手册

    ADRF6850是一款高度集成的宽带正交解调器、频率合成器和可变增益放大器(VGA)。该器件工作在100 MHz至1000 MHz的频率范围,适用于窄带和宽带通信应用,能够执行从中频(IF)直接到基带频率的正交解调。
    的头像 发表于 03-01 10:36 ?601次阅读
    ADRF6850 <b class='flag-5'>100</b>MHz至<b class='flag-5'>1000</b>MHz集成宽带接收机技术手册

    FCTS1000-10-5参考锁相转换器Synergy

    -3 dBm。相位噪声:@ 100 Hz:-80 dBc/Hz。@ 1 kHz:-115 dBc/Hz。@ 10 kHz:-141 dBc/Hz。@ 100 kHz:-158 dBc/Hz
    发表于 02-11 09:29

    ldc1000使用的具体时序是怎样的

    ldc1000 evm,测得它的波形均是在上跳变接收数据和发送数据,这与ldc1000的芯片手册的时序图不同,想问下您ldc1000的使用的具体时序是怎样的
    发表于 01-13 07:59

    请问LDC1000是否可以测量大线圈?

    我使用TI 提供的 LDC1000EVM 模块 测量电感线圈(线圈尺寸 1m*0.5m在100khz下 电感量:27uH Rs:0.3欧),并联电容100pF. 使用TI提供的软件
    发表于 01-08 07:13

    74ALVC164245是否能支持速率100Mbps的信号转换

    请帮忙确认74ALVC164245是否能支持速率100Mbps的信号转换,Datasheet上并没有找到明确的描述,谢谢!
    发表于 12-11 06:51

    【迅电子】龙芯LS2K1000LA和LS2K1000有何区别?

    【迅电子】龙芯LS2K1000LA和LS2K1000有何区别?
    的头像 发表于 11-13 14:13 ?873次阅读
    【迅<b class='flag-5'>为</b>电子】龙芯LS2K<b class='flag-5'>1000</b>LA和LS2K<b class='flag-5'>1000</b>有何区别?

    【北京迅】itop-龙芯2k1000开发指南Linux基础入门vim 编辑器

    【北京迅】itop-龙芯2k1000开发指南Linux基础入门vim 编辑器
    的头像 发表于 10-25 14:56 ?763次阅读
    【北京迅<b class='flag-5'>为</b>】itop-龙芯2k<b class='flag-5'>1000</b>开发指南Linux基础入门vim 编辑器

    INA333 RG接100欧不是放大1000倍吗?怎么输出才2倍左右?

    RG接100欧不是放大1000倍吗?怎么输出才2倍左右?请问要放大1000倍如何接才正确?
    发表于 09-11 07:25