首页 > 编程语言 >Java中“100==100”为true,而"1000==1000"为false?

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

时间:2023-12-20 15:02:43浏览次数:37  
标签:相等 对象 valueOf Integer 100 true 1000

前言

今天跟大家聊一个有趣的话题,在Java中两个Integer对象做比较时,会产生意想不到的结果。

例如:

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

其运行结果是:true。

而如果改成下面这样:

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

其运行结果是:false。

看到这里,懵了没有?

为什么会产生这样的结果呢?

1 Integer对象

上面例子中的a和b,是两个Integer对象。

而非Java中的8种基本类型。

8种基本类型包括:

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

Integer其实是int的包装类型。

在Java中,除了上面的这8种类型,其他的类型都是对象,保存的是引用,而非数据本身。

Integer a = 1000;
Integer b = 1000;

可能有些人认为是下面的简写:

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

这个想法表面上看起来是对的,但实际上有问题。

在JVM中的内存分布情况是下面这样的:

在栈中创建了两个局部变量a和b,同时在堆上new了两块内存区域,他们存放的值都是1000。

变量a的引用指向第一个1000的地址。

而变量b的引用指向第二个1000的地址。

很显然变量a和b的引用不相等。

既然两个Integer对象用==号,比较的是引用是否相等,但下面的这个例子为什么又会返回true呢?

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

不应该也返回false吗?

对象a和b的引用不一样。

Integer a = 1000;
Integer b = 1000;

其实正确的简写是下面这样的:

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

在定义对象a和b时,Java自动调用了Integer.valueOf将数字封装成对象。

而如果数字在low和high之间的话,是直接从IntegerCache缓存中获取的数据。


Integer类的内部,将-128~127之间的数字缓存起来了。

也就是说,如果数字在-128~127,是直接从缓存中获取的Integer对象。如果数字超过了这个范围,则是new出来的新对象。

文章示例中的1000,超出了-128~127的范围,所以对象a和b的引用指向了两个不同的地址。

而示例中的100,在-128~127的范围内,对象a和b的引用指向了同一个地址。

所以会产生文章开头的运行结果。

为什么Integer类会加这个缓存呢?

答:-128~127是使用最频繁的数字,如果不做缓存,会在内存中产生大量指向相同数据的对象,有点浪费内存空间。

Integer a = 1000;
Integer b = 1000;

如果想要上面的对象a和b相等,我们该怎么判断呢?

2 判断相等

在Java中,如果使用==号比较两个对象是否相等,比如:a==b,其实比较的是两个对象的引用是否相等。

很显然变量a和b的引用,指向的是两个不同的地址,引用肯定是不相等的。

因此下面的执行结果是:false。

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

由于1000在Integer缓存的范围之外,因此上面的代码最终会变成这样:

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

如果想要a和b比较时返回true,该怎么办呢?

答:调用equals方法。

代码改成这样的:

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

执行结果是:true。

其实equals方法是Object类的方法,所有对象都有这个方法。

它的底层也是用的==号判断两个Object类型的对象是否相等。

不过Integer类对该方法进行了重写:

它的底层会先调用Integer类的intValue方法获取int类型的数据,然后再通过==号进行比较。

此时,比较的不是两个对象的引用是否相等,而且比较的具体的数据是否相等。

我们使用equals方法,可以判断两个Integer对象的值是否相等,而不是判断引用是否相等。

最近我建了新的技术交流群,打算将它打造成高质量的活跃群,欢迎小伙伴们加入。

我以往的技术群里技术氛围非常不错,大佬很多。

点击这个链接可以加群

总结

Integer类中有缓存,范围是:-128~127

Integer a = 1000;

其实默认调用了Integer.valueOf方法,将数字转换成Integer类型:

Integer a = Integer.valueOf(1000);

如果数字在-128~127之间,则直接从缓存中获取Integer对象。

如果数字在-128~127之外,则该方法会new一个新的Integer对象。

我们在判断两个对象是否相等时,一定要多注意:

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

标签:相等,对象,valueOf,Integer,100,true,1000
From: https://www.cnblogs.com/12lisu/p/17916537.html

相关文章

  • [LeetCode Hot 100] LeetCode153. 寻找旋转排序数组中的最小值
    题目描述思路如果数组翻转后又回到升序的情况,即nums[left]<=nums[right],则nums[left]就是最小值,直接返回。如果数组翻转,需要找到数组中第二部分的第一个元素:若nums[left]<=nums[mid],说明区间[left,mid]连续递增,则最小元素一定不在这个区间里,可以直接排除,最小值在[......
  • 初中英语优秀范文100篇-032My Favourite Season-我最喜欢的季节
    PDF格式公众号回复关键字:SHCZFW032记忆树1Autumnismyfavouriteseason.翻译秋天是我最喜欢的季节。简化记忆秋天句子结构"Autumn"是主语,表示秋天这个季节。"is"是系动词,连接主语和表语。"myfavouriteseason"是表语,表示秋天使我最喜欢的季节。其中,"my"是形容......
  • 100道React高频题整理(附答案背诵版)
    1、简述React有什么特点?React是一个用于构建用户界面的JavaScript库,由Facebook开发并维护。React有以下几个主要特点:声明式设计:React采用声明式设计,让代码更易于理解,且方便调试。你只需描述出你希望程序的最终状态,React会自动确保用户界面与你描述的状态保持一致。组件化:......
  • [LeetCode Hot 100] LeetCode33. 搜索旋转排序数组
    题目描述思路如果nums[left]<=nums[mid],则[left,mid]有序如果nums[left]>nums[mid],则[mid,right]有序方法一:classSolution{publicintsearch(int[]nums,inttarget){if(nums==null||nums.length==0)return-1;intleft=0,ri......
  • [LeetCode Hot 100] LeetCode35. 搜索插入位置
    题目描述思路基础二分搜索模板本质:找到第一个大于等于target的元素的下标注意:该题目不存在重复元素存在一种特殊情况:target>nums的最大值,此时插入的位置正好是left的位置方法一:classSolution{publicintsearchInsert(int[]nums,inttarget){if......
  • [LeetCode Hot 100] LeetCode34.在排序数组中查找元素的第一个和最后一个位置
    题目描述思路:二分查找之寻找左右侧边界两个关键点:1.数组有序;2.时间复杂度O(logn)方法一:classSolution{publicint[]searchRange(int[]nums,inttarget){if(nums.length==0||nums==null){returnnewint[]{-1,-1};}......
  • 记录--一行代码修复100vh bug
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助你知道奇怪的移动视口错误(也称为100vhbug)吗?或者如何以正确的方式创建全屏块?一、100vhbug什么是移动视口错误?你是否曾经在网页上创建过全屏元素?只需添加一行CSS并不难:.my-page{height:100vh}1v......
  • 【2023潇湘夜雨】WIN11_Pro_Canary_26016.1000软件选装纯净版12.19
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_Canary_26016.1000。2.增加部分优化方案,手工精简部分较多,干掉右下角水印。3.OS版本号为26016.1000。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.1......
  • C0328 【1005 C组】模拟测试 斜率 题解
    原题链接:斜率。题意在一个平面直角坐标系中,给定\(n\)个点的横纵坐标,求出哪两个点所构成的连线的斜率最接近\(\frac{P}{Q}\)。数据范围:\(n\le1000000\)。思路显然这是一道数学题,不能直接暴力去找答案。首先我们可以弱化一下题目,求出斜率最接近\(y=0\)即\(x\)轴的两......
  • 同样的程序,有时是gpu正常10%,有时gpu占用率到达或接近100%?提供一个解决方案
    同样的程序,同样的代码,只在不同时间运行,有时是gpu正常10%,有时gpu占用率到达或接近100%?这里提供一个排错的解决方案1、首先打开任务管理器,看看cpu的连续正常运行时间,如果超过了1天,请重启或按shift后关闭电脑再开机,这个方法可以把重复运行的程序的一些积累效应去掉我通过这个方式......