Java 128陷阱+自动装箱拆箱

1.大纲概述

        Int 整型为java八大基础类型之一,Integer是它的包装器类型;int的默认值为0,而Integer的默认值为null。

        128陷阱:指 Integer类封装的数字在[-128,127]范围内比较可以相等,超过此范围不能相等的现象。如下为代码示例:


public static void main(String[] args) 
{Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;Integer e= -129;Integer f= -129;System.out.println(a==b);System.out.println(c==d);System.out.println(e==f);
}

输出:

true
false
false

        自动装箱:int到Integer的变换称为装箱(自动将基本数据类型转换为包装器类型),当有一个Integer对象赋予给int将会自动拆箱,而Integer的自动装箱要求数据介于-128~127之间。

Integer a=Integer.valueOf(100);

        自动拆箱:Integer到Int的变换称为拆箱(自动将包装器类型转换为基本数据类型)

int d=c.intValue()*1-100;

2、代码分析

IntegerCache.low 和IntegerCache.high是“128陷阱”的关键。java对在-128~127之间的Integer的值,用原生数据类型int,会在内存里供重用,也就是说这之间的Integer值进行 == 比较时只是进行int原生数据类型数值比较,超出-128~127的范围,进行 == 比较时是进行地址比较。(引用类型用 == 比较,是对他们的地址进行比较)

Integer 自动装箱代码:        

public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
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() {}}

用两个等号==相比较时,比较的是valueOf的返回值,可以看出,IntegerCache.low 和IntegerCache.high是“128陷阱”的关键。当int i超过某个范围时,返回一个新的对象,即

return new Integer(i);

 否则,如果i在约束的范围内(范围很可能时我们上面提到的[-128,127]),返回某个固定地址的值。即

return IntegerCache.cache[i + (-IntegerCache.low)];

IntegerCache.low默认是-128;IntegerCache.high默认是127。

如果传入的 i 在IntegerCache.low 和IntegerCache.high之间,那就尝试看前面的缓存中有没有打过包的相同的值,如果有就直接返回,否则就新创建一个Integer实例,此时地址会改变,当进行 ==的比较时会返回false.
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive 热门数据分析面试题解析

作者 | 数据管道责编 | 徐威龙封图| CSDN 下载于视觉中国SQL中有一类函数叫聚合函数&#xff0c;比如count、sum、avg、min、max等&#xff0c;这些函数的可以将多行数据按照规整聚集为一行&#xff0c;一般聚集前的数据行要大于聚集后的数据行。而有时候我们不仅想要聚集前的数…

Java-数据类型拓展

整数 // 整数拓展&#xff1a; 进制 二进制0b 八进制0 十进制 十六进制0xint i2 0b10; // 二进制int i8 010; // 八进制int i10 10;int i16 0x10; // 十六进制 0~9 A~FSystem.out.println(i2); // 2System.out.println(i8); // 8System.out.println(i10); //…

MySQL8.0 - 新特性 - 说说InnoDB Log System的隐藏参数

InnoDB在设计lock-free的log system时&#xff0c;除了已有的参数外&#xff0c;还通过宏控制隐藏了一些参数&#xff0c;如果你使用源码编译时&#xff0c;打开cmake选项-DENABLE_EXPERIMENT_SYSVARS1, 就可以看到这些参数了。本文主要简单的过一下这些隐藏的参数所代表的含义…

不改代码也能全面 Serverless 化,阿里中间件如何破解这一难题?

Serverless 话题涉及范围极广&#xff0c;几乎包含了代码管理、测试、发布、运维和扩容等与应用生命周期关联的所有环节。在线应用如何不改代码也能迁移到 Serverless 架构&#xff1f;今天&#xff0c;我们来揭秘阿里巴巴成千上万在线应用的Serverless 演进过程。 AWS Lambda …

java中的值传递

1.概述 引用类型中&#xff0c;java中全部都是值传递&#xff0c;传递对象里的值&#xff0c;而不会传递对象本身。 2.代码示例 public class Main {public static void main(String[] args) {Student a new Student();Student b new Student();a.setName("zhangsan&q…

Java-类型转换

类型转换 public static void main(String[] args) {/*由于java是强类型语言&#xff0c;所以进行有些运算时&#xff0c;需要用到类型转换低 ---------------------------------------- 高byte,short,char ->int ->long ->float ->double强制转换 高-->低自…

linux 环境搭建 Sentinel 控制台

文章目录一、搭建Sentinel 控制台1. Sentine文档2. 下载稳定版本3. 启动sentinel4. 登录 sentinel一、搭建Sentinel 控制台 1. Sentine文档 https://github.com/alibaba/Sentinel/wiki/控制台 2. 下载稳定版本 https://github.com/alibaba/Sentinel/releases wget https:/…

甲骨文Java 14来啦!

甲骨文两年来&#xff0c;每六个月如约发布新版本的Java&#xff0c;Oracle JDK 14为开发人员带来创新功能和新特性预览。Oracle JDK 14增加了一些新特性来提高开发人员工作效率&#xff0c;这些新特性包括&#xff1a;对switch表达式的Java语言支持&#xff0c;用于持续监控JD…

2019阿里巴巴技术面试题集锦(含答案)

为帮助开发者们提升面试技能、有机会入职阿里&#xff0c;云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次整体放出。并通过这些笔试真题开放阿里巴巴工作机会&#xff0c;让更多的开发者加入到阿里这个大平台。 …

揭秘!闲鱼拉新投放系统如何设计

背景 闲鱼目前已经是国内最大的闲置物品交易平台。随着闲鱼体量的增长和用户规模不断扩大&#xff0c;闲鱼App上的一个普通banner抑或是feeds中的一张普通的卡片&#xff0c;每天都可能被数以千万计的人看到。 为了更好地服务好广大的用户群体&#xff0c;更加个性化的内容推…

Springboot/Cloud集成Sentinel 和 入门实战

文章目录一、Springboot/Cloud集成Sentinel1. spring-cloud-alibaba依赖2. 引入 Sentinel starter3. 配置application.yml3. 接入限流埋点4. 访问接口5. sentinel控制台二、入门实战2.1. 流控管理2.2. 快速访问请求一、Springboot/Cloud集成Sentinel 1. spring-cloud-alibaba依…

Java-变量、常量

变量 public class Demo06 {// 类变量 staticstatic double salary 888;// 实例变量&#xff1a; 从属于对象; 如果不自行初始化&#xff0c;这个类型的默认值是 0 0.0// 布尔值 &#xff1a; 默认是false// 除了基本类型&#xff0c;其余都是nullString name;int age;public …

为什么kill进程后socket一直处于FIN_WAIT_1状态

本文介绍一个因为conntrack内核参数设置和iptables规则设置的原因导致TCP连接不能正常关闭(socket一直处于FIN_WAIT_1状态)的案例&#xff0c;并介绍conntrack相关代码在conntrack表项超时后对新报文的处理逻辑。 案例现象 问题的现象&#xff1a; ECS上有一个进程&#xff0…

Docker 开发环境的滑坡

作者 | Micah Adams责编 | 徐威龙封图| CSDN 下载于视觉中国最近&#xff0c;我构建了一个本地开发环境&#xff0c;该环境使用 Docker 进行一些关键的集成测试。 在我要完成这项工作时&#xff0c;我意识到在开始这项工作之前&#xff0c;我没有考虑到这么做的一些意义深远影响…

Springboot全局异常统一处理返回json

文章目录1. 创建一个枚举、封装异常的错误码等信息2. 创建一个自定义异常类继承RuntimeException。3. 自定义异常4. 抛出异常5. 测试1. 创建一个枚举、封装异常的错误码等信息 package com.gblfy.distributedlimiter.enums;public enum ServiceErrCode {REQ_PARAM_ERR(10001, …

关于JavaBean

JavaBean 是特殊的 Java 类&#xff0c;使用 Java 语言书写&#xff0c;并且遵守 JavaBean API 规范。 接下来给出的是 JavaBean 与其它 Java 类相比而言独一无二的特征&#xff1a; 提供一个默认的无参构造函数。需要被序列化并且实现了 Serializable 接口。可能有一系列可读…

TableStore: 海量结构化数据分层存储方案

前言 表格存储是阿里云自研分布式存储系统&#xff0c;可以用来存储海量结构化、半结构化的数据。表格存储支持高性能和容量型两种实例类型。高性能使用SSD的存储介质&#xff0c;针对读多写多的场景都有较好的访问延时。容量型使用的是SSD和SATA混合的存储介质。对写多的场景…

Java-基本运算符

运算符 public class Demo01 {public static void main(String[] args) {// 二元运算符// Ctrl D : 复制当前行到下一行int a 10;int b 20;int c 25;int d 25;System.out.println(ab);System.out.println(a-b);System.out.println(a*b);System.out.println(a/(double)b); …

蚂蚁金服终端实验室演进之路

0. 背景 作为国民级 App&#xff0c;支付宝客户端需要为亿级用户提供多元化的服务&#xff0c;因此应用的稳定性与可靠性面临巨大的挑战&#xff0c;需要不断地完善和优化。 今天&#xff0c;让我们站在服务质量的全方位监控与优化的角度&#xff0c;从蚂蚁终端实验室的演进之…

2020年边缘计算最新前沿报告:如何与核心云、5G、AI协同?如何打造新业态和部署运营?...

作者 | 唐汝林、陈琪责编 | 屠敏头图 | CSDN 下载自东方 IC数据来源 | 华信咨询设计研究院有限公司在数字经济的时代浪潮中&#xff0c;作为关键生产要素的数字技术的快速变革已成为新常态。正当人工智能开始崭露头角时&#xff0c;云计算的边缘化延伸趋势又成为了另一个新焦点…