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

海康威视摄像头网线连接笔记本电脑,客户端提示:1连接设备失败。设备不在线或网络原因引起的连接超时等。(HCNetSDK.dll[7].)解决方案 1.环境 电脑:联想笔记本电脑(win10系统) 摄像头:海康威视DS-2CD3T20D-i5,4mm 连接方式:直接用网线将摄像头和摄像头连接 2.问题: 客户端出现如下提示: 3. 解决流程: 1.确认网线是否有问题:我的网线指示灯常亮,并且设备能够被搜索到,只是一直显示离线 2.按照网上教程直接配置摄像头的ip地址与电脑同一网段:登录失败。 错误码为 HCNetSDK.dll[7].(连接设备失败。设备不在【海康威视吧】_百度贴吧 失败了,没有反应 3.查看有线网卡的地 阅读详情

点击上方“Github爱好者社区”,选择星标

回复“资料”,获取小编整理的一份资料

来自: 码农网

译文链接:http://www.codeceo.com/article/why-java-1000-100.html
英文原文:https://dzone.com/articles/why-1000-1000-returns-false-but-100-100-returns-tr

为什么 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

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

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

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

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

Integer c = 100;

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

Integer i = Integer.valueOf(100);

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

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

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

所以…

Integer c = 100, d = 100;

指向了同一个对象。

这就是为什么我们写

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

我们可以得到true。

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

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

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

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

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); //
    }


好啦,今天的分享就到这儿啦,我们下次见啦~
GitHub原创推荐•  太强了!GitHub开源了1000本技术类的电子书,直接刷爆朋友圈!•  太酷了!GitHub 开发者自制火星车,教程全面开源!网友:这才是大佬!•  太棒了!字节跳动工程师在GitHub开源了一份刷题总结,狂揽8.2K星,霸屏GitHub!•  太赞了!GitHub标星3.6K,这个开源神器让Git代码对比效率提升9.6倍!关注「Github爱好者社区」加星标,每天带你逛Github好玩的项目
【面试系列】软件架构师 高频面试题及详细解答 本文介绍了软件架构师岗位的初级、中级和高级面试题及详细解答,涵盖了系统设计、面向对象设计、分布式系统、云计算技术、性能优化等关键领域。通过这些问题和解答,候选人可以深入理解软件架构师的核心职责和技能要求。此外,文章总结了在面试中需要掌握的常考知识点,包括架构模式、分布式系统管理、安全性、数据管理和DevOps实践。通过掌握这些知识点,软件架构师能够有效设计和指导复杂系统的结构,确保系统的可扩展性、性能和维护性。 阅读详情

相关推荐

Silvaco TCAD仿真4——DeckBuild实战:从示例库到自定义设计

本文详细介绍了Silvaco TCAD仿真工具DeckBuild的实战应用,从示例库的使用到自定义设计的全过程。通过具体案例和参数修改技巧,帮助用户快速掌握TCAD仿真技术,提升半导体器件设计的效率和精度。特别适合需要从基础入门到进阶操作的工程师和研究人员。

weixin_29284657的博客 435

关于a=100,b=100,a is b为ture,而等于a=1000等于flase

1、当a = 10,b = 10时

边缘拼命划水的小陈 1182

OpenWebUI联网搜索实战:如何用SearXNG让本地大模型获取实时信息(附百度/360配置)

本文详细介绍了如何通过部署开源元搜索引擎SearXNG,为本地运行的OpenWebUI大语言模型(如Qwen、Llama)配置联网搜索功能,解决其知识库过时的问题。文章重点讲解了SearXNG的Docker部署、集成国内搜索引擎(如百度、360)的配置方法,以及如何与OpenWebUI无缝对接,从而实现本地大模型获取实时、准确的中文信息,提升其实用性。

weixin_28835583的博客 1887

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

为什么 Java 中“1000==1000”为false,而”100==100“为true? 这是一个挺有意思的讨论话题。 如果你运行下面的代码: Integer a = 1000, b = 1000; System.out.println(a == b);//1Integer c = 100, d = 100; System.out.println(c == d);//2 你会得到 falsetrue 基本知识:我们知道,如果两...

风水道人 593

CyberChef本地搭建

CyberChef本地搭建

2301_80241182的博客 6085

使用Eggjs做服务端获取微信小程序云开发数据库的access_token

最近自己想写了一个微信小程序,恰巧里面有个云开发,恰巧里面有个数据库,那懒人的我,就直接用云开发里面的数据库了,做测试或者正式也好,对于刚开始来说,免费的配额是够用的。 后来想到在小程序云开发上面的数据怎么看才方便?刚好微信小程序有一个服务端API,那就方便很多了,那就直接敲个服务端来获取云开发上数据库的数据出来到自己的后台上面,那以后管理起来也方便很多。 看了一下服务端api之后,发现有三个重要...

kalenE992的博客 1705

涨姿势:为什么Java中“1000==1000”为false,而”100==100“为true?

如果你看去看 Integer.java 类,你会发现有一个内部私有类,IntegerCache.java,它缓存了从-128到127之间的所有的整数对象。如果两个引用指向不同的对象,用==表示它们是不相等的,即使它们的内容相同。合乎逻辑的理由是,在此范围内的“小”整数使用率比大整数要高,因此,使用相同的底层对象是有价值的,可以减少潜在的内存占用。现在,如果我们去看valueOf()方法,我们可以看到​​​​​​​。运行下面的代码,享受它的魅力吧​​​​​​​。然而,通过反射API你会误用此功能。

IT界那些事儿 7786

NCBI Datasets CLI优化:解决基因组数据下载报错与速度问题

基因组数据下载是生物信息学分析的关键环节,其稳定性和效率直接影响研究进度。NCBI Datasets CLI作为官方命令行工具,常面临连接中断和下载速度慢两大痛点,这主要源于服务器连接限制和网络传输问题。通过自动重试机制和校验修复流程可提升稳定性,而连接复用与CDN加速等技术能显著提高下载效率。在植物基因组等大规模数据场景中,结合脱水模式和增量更新策略可减少70%传输量。本文以艾草基因组项目为例,展示如何通过并行下载和API优化将100个基因组的下载时间从18小时缩短至2小时,为生物信息学研究提供可靠的数据

weixin_29051245的博客 243

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

Java技术栈www.javastack.cn关注阅读更多优质文章为什么 Java 中“1000==1000”为false,而”100==100“为true?这是一个挺有意思的讨论话题...

Java技术栈,分享最主流的Java技术 469

KANO分析模型

KANO分析模型的基本概念,目的意义,应用场景,实现方法和示例等

JasonH2021的博客 3069

2022年电赛E题声源定位跟踪系统

电赛声源定位

qq_53357019的博客 2万+

涨姿势:为什么 Java 中 “1000==1000” 为 false,而 ”100==100“ 为 true?

Java中Integer类的自动装箱机制利用了整数缓存池(默认-128到127),通过Integer.valueOf()方法复用缓存对象。当数值在缓存范围内时,返回同一对象引用(==比较为true),超出范围则创建新对象(==比较为false)。类似机制也存在于其他包装类如Byte、Short等。比较包装类对象时应使用equals()而非==,避免因缓存范围导致的误判。可通过JVM参数调整缓存上限,但需谨慎使用。该设计采用享元模式,优化了小整数场景的性能和内存开销。

油墨香^-^的博客 770

英飞凌TC3xx之一起认识GTM系列(一)先来认识GTM架构

本文讲述英飞凌TC3xx的通用计时器GTM的架构。

无所适从的我的博客 4600

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

大家好,我是可乐。在日常编程中,我们经常遇到一些看似简单却隐藏着复杂逻辑的问题。比如,你是否想过为什么在 Java 中表达式1000==1000会返回 false,而100==100却返回 true 呢?

IT可乐 840

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 正在刷大厂面试题,咳咳…主管拍了我一下…
下一篇: 再见!Redis!
公众号:【GitHub爱好者社区】
博客等级 码龄6年 356粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值