当前位置: 首页 > news >正文

Java中Integer(127)==Integer(127)为True,Integer(128)==Integer(128)却为False,这是为什么?

文章目录

    • 1.前言
    • 2. 源码解析
    • 3.总结


1.前言

相信大家职业生涯中或多或少的碰到过Java比较变态的笔试题,下面这道题目大家应该不陌生:

Integer i = 127;
Integer j = 127;Integer m = 128;
Integer n = 128;System.out.println(i == j); // 输出为 true
System.out.println(m == n); // 输出为 false

那么为什么i == j为true,m == n为false,下面我们来分析一下

2. 源码解析

在这里插入图片描述

从上述代码中可以看出,Integer类中定义了一个私有的int value字段,用于存储整数的值。另外,还有一个静态的valueOf方法,用于获取一个Integer对象,该方法内部通过判断传入的值是否在-128到127范围内,如果在这个范围内会直接使用缓存中的对象。

接下来,我们来分析题目中的情况:

Integer i = 127;
Integer j = 127;
Integer m = 128;
Integer n = 128;System.out.println(i == j); // 输出为 true
System.out.println(m == n); // 输出为 false

首先,我们知道Java对于-128到127之间的整数会进行缓存,即Integer.valueOf()方法返回的是缓存中的对象,而不是新创建的对象。这就解释了为什么i == j为true,因为它们都是缓存中的同一个对象。

但是,对于m和n,它们的值是128,超出了缓存范围,所以Integer.valueOf()方法会创建新的Integer对象,因此m == n为false,它们是不同的对象。

3.总结

这个现象是由于Java对小整数进行了缓存优化,避免了频繁创建新的Integer对象,提高了性能。但是要注意,这种缓存机制只对-128到127之间的整数有效,超出这个范围的整数仍然会创建新的对象。在比较Integer对象时,最好使用equals方法而不是==,以确保比较的是值而不是引用。

http://www.lryc.cn/news/287841.html

相关文章:

  • 【Unity】粒子贴图异常白边问题
  • bxCAN接收处理
  • 前端面试题-(浏览器内核,CSS选择器优先级,盒子模型,CSS硬件加速,CSS扩展)
  • WEB前端标签的使用
  • 739. 每日温度
  • stm32F103C8T6简介及标准库和HAL库的区别
  • 操作系统(3)---操作系统引导
  • Vue3+Ts:实现paypal按钮
  • .[Decipher@mailfence.com].faust 勒索病毒数据怎么处理|数据解密恢复
  • 【UE Niagara】制作星光飘落效果
  • SLAM初学
  • 腾讯云轻量应用服务器Docker如何一键搭建属于自己的幻兽帕鲁服务器?
  • win10+elasticsearch8.12 安装教程
  • 经典面试题-死锁
  • mysql面试题合集-基础
  • 点灯大师(STM32)
  • @EnableEurekaServer
  • Java中的接口
  • Linux笔记之bash脚本中的-e、和
  • mapstruct自定义转换,怎样将String转化为List
  • torch.matmul和torch.bmm区别
  • k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)
  • PHP - Yii2 异步队列
  • leetcode560和为k的子数组
  • 【ProtoBuf】使用指南
  • Buffer Pool
  • jetson-inference----docker内运行分类任务
  • Python脚本之操作Redis Cluster【二】
  • 认识数学建模
  • 计算机工作原理解析和解剖(基础版)