Java——详解Integer128陷阱

article/2025/8/23 23:45:49

今天我们来一起探讨一下Java的128陷阱

首先我们通过代码对128陷阱进行一个认知

public static void main(String[] args){Integer a = 127 ;Integer b = 127 ;Integer c = 128 ;Integer d = 128 ;Integer e = 1000 ;Integer f = 1000 ;int a1 = 127;int b1 = 127;int c1 = 128;int d1 = 128;int e1 = 1000;int f1 = 1000;System.out.println(a == b);System.out.println(c == d);System.out.println(e == f);System.out.println(a1 == b1);System.out.println(c1 == d1);System.out.println(e1 == f1);}

运行的结果如下:

可以看到,当数据为基本类型int的时候,运行的结果都是true,而如果是封装类型Integer的时候,数据为127的时候使true,128和1000都为false,那这是为什么呢?

 首先我们要理解==比较的是什么,它比较的是栈中数据是否相同,我们都知道,基本类型的数据的变量名和值都存在栈中(作为类的属性的情况除外),因此,所有int类型的数据运行都会为true。

 

同样,我们也都知道,引用类型会把它的值存在堆中,栈中存储的是变量名及堆中数据的地址,揪下来我们要引入一个概念

基本类型的包装存在自动拆装箱机制

 那么什么是自动拆箱与自动装箱呢,简单的来说

Integer a = 1;其实代表的是Integer a = new Integer(1);我们不需要去进行初始化,这个方法会自己初始化在堆中开辟一片区域存储数据。自动拆箱也类似int b = a;代表的是int b = Integer.valueOf(a);同样不需要我们主动调用方法。

说完了自动拆装箱,大家就可以理解为什么会出现false,因为每次初始化都会开辟新的区域,虽然两块区域可能储存的值相同,但是它们是堆中两块不同的区域,栈中存储的地址不同,因此比较会出现false

最后一个问题就是,为什么值为127 的时候就会认为是true?

Java设计者认为:

每次都要开辟新空间会占用大量的资源,因此他们规定在-128~127(因为Java设计者认为大家对数的使用大多在100以内)之间的Integer类型的变量,直接指向常量池中的缓存地址,不会new开辟出新的空间。  

 因此当值在 -128~127区间内的时候,两个相同值的变量会指向相同地址,这就是Java中的128陷阱

除此之外,我们来看Integer类的原码,可以发现,陷阱的范围是可以被修改的,如果大家有需要的话就可以自行修改上限与下限

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

 

 

 

总结

在基本类型的包装类运用时,还是更推荐大家使用equals方法来比较,因为这个方法比较的两个变量存在堆中的值是否相等

 

———————————————————————————————————————————————————— 

希望这篇文章能够帮到大家,如果我的文章有问题,欢迎批评指正。如果您还有哪里不理解,也欢迎留言,我们 一起讨论学习

 


http://chatgpt.dhexx.cn/article/uCBeAH2i.shtml

相关文章

Java-11

学习来源&#xff1a;日撸 Java 三百行&#xff08;31-40天&#xff0c;图&#xff09;_闵帆的博客-CSDN博客 36 邻接表 36.1 相当于图的压缩存储. 每一行数据用一个单链表存储。 36.2 重写了广度优先遍历. 可以发现, 使用队列的机制不变. 仅仅是把其中的 for 循环换成了 wh…

JAVA101-135

JAVA101-150 字符串StringBuilder链式编程简化代码对应的关系可以使用查表法&#xff0c;通过数组的对应的下表来改变成相应的值 修改字符串字符串变整数重点&#xff1a;字符串变为数组 ArrayList集合的基本使用集合一开始的长度为0&#xff0c;如果用循环&#xff0c;进不去 …

Java-1214

Spring5总体学习内容 Spring基本概念IOC容器AopJdbcTemplate事务管理Spring5新特性 框架概述 Spring是轻量级的开源的JavaEE框架Spring可以解决企业应用开发的复杂性Spring有两个核心部分&#xff1a;IOC、Aop IOC&#xff1a;控制反转&#xff0c;把创建对象的过程交给Spri…

下载Google Play外国区APP技巧

安卓用户若遇到喜欢的APP是外国区的&#xff0c;只要翻墙就能下载。比起果粉还要注册&#xff0c;是简便很多。但有没有更简单的办法&#xff1f;这个必须有&#xff01;笔者前几天在网上闲逛时&#xff0c;就发现了一个给力的网站。让你不用翻墙&#xff0c;只需3个步骤&#…

Google Play国内应用市场发布版本步骤指导

应用发布步骤指导 前言Google Play华为小米Vivooppo 博客创建时间&#xff1a;2022.08.19 博客更新时间&#xff1a;2022.08.22 以Android studio build7.0.0&#xff0c;SDKVersion 31来分析讲解。如图文和网上其他资料不一致&#xff0c;可能是别的资料版本较低而已。 前言 …

Google Play App Signing的问题以及解决方式

Google Play App Signing是Google Play 的应用签名&#xff0c;在Google Play上创建项目的时候如果勾选了它&#xff0c;那么它就会生成一个签名文件&#xff0c;不管你上传到Google Play的apk是否用你的签名文件打包&#xff0c;最终都会被替换成Google Play App Signing里的签…

如何将Flutter开发的Android app 发布Google Play(谷歌应用商店)流程

将Flutter Android app 发布Google Play&#xff08;谷歌应用商店&#xff09;流程 一、首先就是要做到科学&#xff01; 二、打开google play官网&#xff0c;注册谷歌账号 三、打开谷歌开发者站点https://play.google.com/apps/publish/signup/创建你的App应用 四、创建完…

h5/uni-app打开手机app,没有则跳转到商店下载

需求&#xff1a;在做商品分享/直播分享时&#xff0c;app内分享出去的链接&#xff0c;能够在微信、手机浏览器打开。 遇到的问题&#xff1a; 1&#xff0c;Android&#xff0c;当手机没有下载app时&#xff0c;在浏览器打开&#xff0c;会下载app&#xff0c;但是手机下载了…

最新版Google Pay上传App指南

现在2022年&#xff0c;是时候来个最新版的操作指南 创建应用 使用谷歌市场开发者账号登录 开发者平台。成功登录后&#xff0c;单击 创建应用。 填写应用的 应用名称。选择应用的 默认语言。在应用或游戏处&#xff0c;选择 应用。根据个人情况选择免费或付费。 勾选 开发者…

网页下载Google Play 的App

网页下载Google Play 的App 文章目录[点击展开](?)[] 前言 当你想在google play上下载某个应用&#xff0c;而无奈手机的系统并没有安装google servicess&#xff0c;此刻是否有些捉急&#xff1f; 本文分享的是一个网站&#xff0c;它可以无需手机而直接通过网页下载Google P…

【Google Play】App Bundle 使用详解 ( 简介 | 应用内更新 | 即时更新 | 灵活更新 )

Google Play 上架完整流程 系列文章目录 【Google Play】创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 ) 【Google Play】创建并设置应用 ( 访问权限 | 内容分级 | 受众群体 | 类别及联系方式 | 商品详情 ) 【Google Play】App Bundle 使用详解 ( 简介 | 应用内更…

Google Play上架App设置隐私政策声明问题

APP上架Google Play一定要设置隐私政策声明,否则是不给上架的 隐私政策解决方法,生成隐私内容&#xff1a; 点击网址进入 App Privacy Policy Generator 之后根据app的名称&#xff0c;类型&#xff0c;平台&#xff0c;选择对应的选项&#xff0c; 包含对应的第三方隐私服务…

WhatsApp的下载与更新

这两天登录手机&#xff08;安卓&#xff09;的WhatsApp&#xff0c;一直显示我的WhatsApp即将几天后更新&#xff0c;请及时更新到最新的版本&#xff0c;尝试了网上的多种方法&#xff0c;还是没有成功&#xff0c;当然不排除我笨的因素&#xff0c;后来我的小脑瓜子那么一转…

ubuntu安装google app engine环境

需要goog app engine的运行环境&#xff0c;结果翻找半天找不到怎么安装&#xff0c;做记录&#xff1a; 下载app engine &#xff0c; 地址如下&#xff1a; https://cloud.google.com/appengine/downloads?hlzh-TW 到这个网页&#xff0c;找不到下载地址&#xff0c;但却…

google play app下载方法测试

部分参考&#xff1a;http://www.zhihu.com/question/20232626 因为需求&#xff0c;需要从Google play上下载一个APP&#xff1a;Ticketmaster 寻找了一些方法&#xff1a; 基本要求&#xff1a;需要翻墙。 方法1&#xff1a;http://apk-dl.com/ &#xff08;不用翻墙&…

在电脑端下载google play上的app,将其下载成apk

想要下载googleplay上的app&#xff0c;但是没有直接的下载链接。这里推荐一个chrome浏览器上的插件&#xff1a;APK Downloader。 插件安装完成后&#xff0c;在google play搜索到需要下载的app后&#xff0c;将其网页URL复制到插件上生成下载链接即可。

直接下载Google Play上APP的安装包

1、先在GooglePlay上找到自己需要下载的Package Name或者软件的地址链接. 下图是APP提取网站的示意图&#xff1a; 2、打开Online APK Downloader(点击进入)&#xff0c;在输入框中粘贴刚才复制的Package Name或地址。点击“Generate DownIoad Link”。如果输入地址提示错误&a…

Google市场,APP版本更新实现方式

一、直接跳转google play应用详情 直接跳转到google play应用详情内由用户手动触发版本更新。 实现方式包括两种&#xff1a;跳转到google play app应用详情内和跳转到google play网页版应用详情内。 一般实现原则是用户如果安装了google play app跳转到app&#xff0c;未安…

如何从google play 网页下载app到本地

前提&#xff1a; 浏览器可以翻墙 操作 首先&#xff0c;通过电脑打开google play的官方页面&#xff08;https://play.google.com/store/apps&#xff09;&#xff0c;并找到你希望下载的应用&#xff0c;本文以微信为例子&#xff1b;打开微信的安装页面&#xff0c;找到浏…