当前位置:首页 > 科技  > 软件

Java中“100=100”为True,而"1000=1000"为False?

来源: 责编: 时间:2023-12-20 09:22:42 324观看
导读前言今天跟大家聊一个有趣的话题,在Java中两个Integer对象做比较时,会产生意想不到的结果。例如:Integer a = 100;Integer b = 100;System.out.println(a==b);其运行结果是:true。而如果改成下面这样:Integer a = 1000;Int

HGx28资讯网——每日最新资讯28at.com

前言

今天跟大家聊一个有趣的话题,在Java中两个Integer对象做比较时,会产生意想不到的结果。HGx28资讯网——每日最新资讯28at.com

例如:HGx28资讯网——每日最新资讯28at.com

Integer a = 100;Integer b = 100;System.out.println(a==b);

其运行结果是:true。HGx28资讯网——每日最新资讯28at.com

而如果改成下面这样:HGx28资讯网——每日最新资讯28at.com

Integer a = 1000;Integer b = 1000;System.out.println(a==b);

其运行结果是:false。HGx28资讯网——每日最新资讯28at.com

看到这里,懵了没有?HGx28资讯网——每日最新资讯28at.com

为什么会产生这样的结果呢?HGx28资讯网——每日最新资讯28at.com

1、Integer对象

上面例子中的a和b,是两个Integer对象。HGx28资讯网——每日最新资讯28at.com

而非Java中的8种基本类型。HGx28资讯网——每日最新资讯28at.com

8种基本类型包括:HGx28资讯网——每日最新资讯28at.com

  • byte
  • short
  • int
  • long
  • float
  • double
  • boolean
  • char

Integer其实是int的包装类型。HGx28资讯网——每日最新资讯28at.com

在Java中,除了上面的这8种类型,其他的类型都是对象,保存的是引用,而非数据本身。HGx28资讯网——每日最新资讯28at.com

Integer a = 1000;Integer b = 1000;

可能有些人认为是下面的简写:HGx28资讯网——每日最新资讯28at.com

Integer a = new Integer(1000);Integer b = new Integer(1000);

这个想法表面上看起来是对的,但实际上有问题。HGx28资讯网——每日最新资讯28at.com

在JVM中的内存分布情况是下面这样的:HGx28资讯网——每日最新资讯28at.com

HGx28资讯网——每日最新资讯28at.com

在栈中创建了两个局部变量a和b,同时在堆上new了两块内存区域,他们存放的值都是1000。HGx28资讯网——每日最新资讯28at.com

变量a的引用指向第一个1000的地址。HGx28资讯网——每日最新资讯28at.com

而变量b的引用指向第二个1000的地址。HGx28资讯网——每日最新资讯28at.com

很显然变量a和b的引用不相等。HGx28资讯网——每日最新资讯28at.com

既然两个Integer对象用==号,比较的是引用是否相等,但下面的这个例子为什么又会返回true呢?HGx28资讯网——每日最新资讯28at.com

Integer a = 100;Integer b = 100;System.out.println(a==b);

不应该也返回false吗?HGx28资讯网——每日最新资讯28at.com

对象a和b的引用不一样。HGx28资讯网——每日最新资讯28at.com

Integer a = 1000;Integer b = 1000;

其实正确的简写是下面这样的:HGx28资讯网——每日最新资讯28at.com

Integer a = Integer.valueOf(1000);Integer b = Integer.valueOf(1000);

在定义对象a和b时,Java自动调用了Integer.valueOf将数字封装成对象。HGx28资讯网——每日最新资讯28at.com

HGx28资讯网——每日最新资讯28at.com

而如果数字在low和high之间的话,是直接从IntegerCache缓存中获取的数据。HGx28资讯网——每日最新资讯28at.com

HGx28资讯网——每日最新资讯28at.com

Integer类的内部,将-128~127之间的数字缓存起来了。HGx28资讯网——每日最新资讯28at.com

也就是说,如果数字在-128~127,是直接从缓存中获取的Integer对象。如果数字超过了这个范围,则是new出来的新对象。HGx28资讯网——每日最新资讯28at.com

文章示例中的1000,超出了-128~127的范围,所以对象a和b的引用指向了两个不同的地址。HGx28资讯网——每日最新资讯28at.com

而示例中的100,在-128~127的范围内,对象a和b的引用指向了同一个地址。HGx28资讯网——每日最新资讯28at.com

所以会产生文章开头的运行结果。HGx28资讯网——每日最新资讯28at.com

为什么Integer类会加这个缓存呢?HGx28资讯网——每日最新资讯28at.com

答:-128~127是使用最频繁的数字,如果不做缓存,会在内存中产生大量指向相同数据的对象,有点浪费内存空间。HGx28资讯网——每日最新资讯28at.com

Integer a = 1000;Integer b = 1000;

如果想要上面的对象a和b相等,我们该怎么判断呢?HGx28资讯网——每日最新资讯28at.com

2、判断相等

在Java中,如果使用==号比较两个对象是否相等,比如:a==b,其实比较的是两个对象的引用是否相等。HGx28资讯网——每日最新资讯28at.com

很显然变量a和b的引用,指向的是两个不同的地址,引用肯定是不相等的。HGx28资讯网——每日最新资讯28at.com

因此下面的执行结果是:false。HGx28资讯网——每日最新资讯28at.com

Integer a =  Integer.valueOf(1000);Integer b = Integer.valueOf(1000);System.out.println(a==b);

由于1000在Integer缓存的范围之外,因此上面的代码最终会变成这样:HGx28资讯网——每日最新资讯28at.com

Integer a =  new Integer(1000);Integer b = new Integer(1000);System.out.println(a==b);

如果想要a和b比较时返回true,该怎么办呢?HGx28资讯网——每日最新资讯28at.com

答:调用equals方法。HGx28资讯网——每日最新资讯28at.com

代码改成这样的:HGx28资讯网——每日最新资讯28at.com

Integer a = Integer.valueOf(1000);Integer b = Integer.valueOf(1000);System.out.println(a.equals(b));

执行结果是:true。HGx28资讯网——每日最新资讯28at.com

其实equals方法是Object类的方法,所有对象都有这个方法。HGx28资讯网——每日最新资讯28at.com

HGx28资讯网——每日最新资讯28at.com

它的底层也是用的==号判断两个Object类型的对象是否相等。HGx28资讯网——每日最新资讯28at.com

不过Integer类对该方法进行了重写:HGx28资讯网——每日最新资讯28at.com

HGx28资讯网——每日最新资讯28at.com

它的底层会先调用Integer类的intValue方法获取int类型的数据,然后再通过==号进行比较。HGx28资讯网——每日最新资讯28at.com

此时,比较的不是两个对象的引用是否相等,而且比较的具体的数据是否相等。HGx28资讯网——每日最新资讯28at.com

我们使用equals方法,可以判断两个Integer对象的值是否相等,而不是判断引用是否相等。HGx28资讯网——每日最新资讯28at.com

总结

Integer类中有缓存,范围是:-128~127。HGx28资讯网——每日最新资讯28at.com

Integer a = 1000;

其实默认调用了Integer.valueOf方法,将数字转换成Integer类型:HGx28资讯网——每日最新资讯28at.com

Integer a = Integer.valueOf(1000);

如果数字在-128~127之间,则直接从缓存中获取Integer对象。HGx28资讯网——每日最新资讯28at.com

如果数字在-128~127之外,则该方法会new一个新的Integer对象。HGx28资讯网——每日最新资讯28at.com

我们在判断两个对象是否相等时,一定要多注意:HGx28资讯网——每日最新资讯28at.com

  1. 判断两个对象的引用是否相等,用==号判断。
  2. 判断两个对象的值是否相等,调用equals方法判断。

本文链接:http://www.28at.com/showinfo-26-50024-0.htmlJava中“100=100”为True,而"1000=1000"为False?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 什么是NIO?你知道吗?

下一篇: 探索Zabbix API(三):导出主机组资源使用率

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 服务存储设计模式:Cache-Aside模式

    Cache-Aside模式一种常用的缓存方式,通常是把数据从主存储加载到KV缓存中,加速后续的访问。在存在重复度的场景,Cache-Aside可以提升服务性能,降低底层存储的压力,缺点是缓存和底
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
Top