Java自动装箱与自动拆箱

news2024/11/14 13:48:17

1、Java基本数据类型及其对应的包装器类类型

Java中共用8种基本数据类型,并为这8种基本数据类型中的每一种都提供了一个包装器类,例如int类型对应的包装器类是Integer。具体类型如下表:
在这里插入图片描述

2、自动装箱和自动拆箱

  • 自动装箱:就是指自动将基本数据类型转换为包装器类型
  • 自动拆箱:就是指自动将包装器类型转换为基本数据类型
Integer i = 19;  // 自动装箱
int j = i;  // 自动拆箱

如上第一行代码,数组19是基本数据类型(int),当赋值给包装器类型(Integer)变量时,触发自动装箱操作,创建一个Integer类型对象,并且赋值给了 i 。其底层实际执行了以下代码:

Integer i = Integer.valueOf(19);

同理,第二行代码,将 i 赋值给 j,触发了自动拆箱操作,将 i 中的数据取出赋值给 j 。其底层实际执行了以下代码:

int j = i.intValue();

3、双等于“=="

通过” == “ 来比较对比的是栈中的值,基本数据类型比较的值,引用数据类型比较的是堆中内存对象的地址。即判断两个对象是否相等,实际上是在判断两个局部变量存储的地址是否相同,即是否指向相同的对象。
但如下代码中比较的a1和a2却是相等的。b1和b2又是不相等的。

Integer a1 = 58;
Integer a2 = 58;
Integer b1 = 129;
Integer b2 = 129;
Integer a3 = new Integer(58);
System.out.println(a1 == a2);  // true
System.out.println(b1 == b2);  // false
System.out.println(a1 == a3);  // false

实际是,Integer运用了 享元设计模式 来复用对象,当通过自动装箱,即调用 valueOf() 来创建Integer对象的时候,如果要创建的Integer对象的值在 -128~127之间,就会从IntegerCache类中直接返回,否则才会调用new方法创建新的对象。即a1和a2都是指向同一个对象(享元对象),b1和b2不是同一个对象。 而Integer a3 = new Integer(58);并不会调用valueOf(),即不会使用到IntegerCache。

为什么IntegerCache只缓存 -128~127之间的整型值?

当IntegerCache类被加载的时候,缓存的享元对象会被集中一次性创建好,而整型数值太多,不能一次性被创建,否则会占用太多的内存,类加载的时间会过长,即只能缓存大部分应用来说最常用的整型值,即一个字节的大小,byte数据类型的范围。
实际,jdk提供了自定义缓存的最大值,设置方法有

方法一: -Djava.lang.Integer.IntegerCache.high = 255
方法二: -XX:AutoBoxChaheMax = 255

4、字符串类型String

 String s1 = "小姐姐";
 String s2 = "小姐姐";
 String s3 = new String("小姐姐");
 System.out.println(s1 == s2);  // true
 System.out.println(s1 == s3);  // false

String类型利用了享元设计模式来复用相同的字符串常量,JVM会专门开辟一块存储区来存储字符串常量,这块存储区叫做”字符串常量池“

Integer类中要共享的对象是在类加载的时候就会集中一次性创建好,而字符串是在第一次被使用时被存储到常量池中,当之后再使用的时候,就直接引用常量池中已经存在的即可。

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

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

相关文章

【大道模式】状态模式 - State Pattern(审核状态流转)

最近在实现一个简单的审核系统,包含多个审核状态和多个审核动作,将业务逻辑映射到代码中感觉会有很多繁杂的逻辑,因此,会思考用一个比较通用、易扩展、易维护、易测试的模式来应对这种场景,了解了一下,就是…

Java数据结构与Java算法学习Day03---线性表(简略笔记记录)

目录 一、线性表 38 二、顺序表 39 三、链表 45 3.1单向链表 46、47、48 3.2双向链表 49 3.3链表反转 (面试中高频题目) 56 3.4快慢指针 57 3.4.1中间值问题 57 3.4.2单向链表是否有环问题 58 3.4.3有环链表入口问题 60 3.5循环链表 61 3.6…

(Java)Mybatis学习笔记(三)

前言 继续学习MyBatis各种查询功能章节,争取早日学完mybatis MyBatis中各种查询功能 ❄️若查询出的 数据只有一条,可以通过实体类对象或集合接收 ❄️若查询出的 数据有多条,可以通过集合接收,一定不能通过实体类对象接收&am…

社区系统项目复盘-8

文章目录任务执行和调度热帖排行生成长图优化网站的性能使用Quartz执行定时任务,实现热帖排行功能时,通过定时任务定时计算帖子分数,降低计算的数据量。使用wkhtmltopdf生成长图。通过多级缓存对热帖功能进行优化,提升网站性能。 …

回归分析-书后习题回顾总结

4-1 题目 理论基础 经典多元线性回归模型 参数β\betaβ的最小二乘估计 设rank(C)m1≤nrank(C)m1≤nrank(C)m1≤n,则β^b(CTC)−1CTY\widehat{\beta}b(C^{T}C)^{-1}C^{T}Yβ​b(CTC)−1CTY是β\betaβ的最小二乘估计 具体解题

[附源码]计算机毕业设计网文论坛管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

本田125摩托安装版成型模具设计及仿真(任务书+说明书+工艺卡片+cad图纸+sw三维图)

目录 1 绪论 1 2 模塑工艺规程的编制 3 2.1塑件的工艺性分析 3 2.1.1塑件的原材料分析 3 2.2塑件的结构和尺寸精度及表面质量分析 4 2.2.1结构分析 4 2.2.2尺寸精度分析 4 2.2.3表面质量分析 4 2.3计算塑件的体积和质量 4 2.4塑件成型工艺参数的确定 5 2…

34. 在排序数组中查找元素的第一个和最后一个位置

🌈🌈😄😄 欢迎来到茶色岛独家岛屿,本期将为大家揭晓34. 在排序数组中查找元素的第一个和最后一个位置,做好准备了么,那么开始吧。 🌲🌲🐴🐴 一、题…

[激光原理与应用-36]:《光电检测技术-3》- 光学测量基础 - 光电效应与光电探测器的基本原理

目录 一、概述 二、光电检测的理论基础:光电效应 三、分类 3.1 光子效应 3.2 热效应 四、光电检测器的参数 五、常见的光电探测器 5.1 光电倍增管:微弱光信号转换成电信号 5.2 光电导器件:电阻或电流随着光强的变化而变化 5.3 光伏…

idea 启动报错 Command line is too long

idea 运行启动类报错 Command line is too long 启动报错信息:Error running ‘Application‘: Command line is too long. 翻译过来就是:启动命令过长! 解决方案 1、点开项目启动配置项目; 2、shorten command line 选项选择 J…

(五)进程管理:进程的状态与控制

文章目录一、进程的状态二、进程控制1. 进程控制的原语2. 挂起与激活一、进程的状态 进程的生命周期:从创建到终止的过程 进程的三种基本状态 就绪(Ready) 可运行而未运行的状态,进程已经分配到除了处理机外的所有资源&#xf…

[附源码]计算机毕业设计校园订餐系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

python数据分析及可视化(十六)金融量化(金融工具、金融分析、Tushare安装使用、双均线分析)

金融介绍 金融就是对现有资源进行重新整合之后,实现价值和利润的等效流通。 比如小明想把手里的资金投资给小李,而小李有好的增值项目但是缺少资金,如果小李的项目创业成功,小明的资金就会增长。 金融工具 在金融市场中可交易的…

时序数据库基本概念学习

目录1、时序数据1.1 定义1.2 数学模型1.3 数据特点2、存储优化3、存储原理4、时序数据模型4.1 基于标签(tag-value)4.2 基于树形(tree schema)1、时序数据 1.1 定义 时序数据就是一串按时间维度索引的数据,这类数据描…

C++11闭包函数的几种实现方法

什么是闭包函数 函数就是对传入的一组参数进行运算的行为,闭包函数就是有状态的函数,在参与运算时,除了传入的参数外,还可以对上下文的状态进行运算。类函数运行时就是典型的闭包函数,类函数运行起来后其对象就是状态…

Spring - @PostConstruct 源码解析

文章目录Prejavax.annotation.PostConstruct 注解源码解析扩展示例Pre Spring Boot - 扩展接口一览 javax.annotation.PostConstruct 注解 Documented Retention (RUNTIME) Target(METHOD) public interface PostConstruct { }严格意义上来说这个并不算一个扩展点&#xff0c…

[附源码]计算机毕业设计校园订餐管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

文献阅读总结(4)Graph convolution machine for context-aware recommender system

上下文感知的图卷积推荐系统 推荐方面的最新进展表明,可以通过在用户-项目交互图上执行图卷积来学习更好的用户和项目表示,然而,该方法在协同过滤(CF)的场景中有一定的局限性,在这种场景中交互上下文是不可用的。 在这项工作中&…

python关联规则学习:FP-Growth算法对药品进行“菜篮子”分析

产品可以根据销售者进行分类 在Evolution上,有一些顶级类别(“药品”,“数字商品”,“欺诈相关”等)细分为特定于产品的页面。每个页面包含不同供应商的几个列表。 最近我们被客户要求撰写关于关联规则的研究报告&am…

字符串的扩展

字符串解读 es6加强了对Unicode 的支持,允许\uxxxx的形式展现一个字符,例如: console.log(\u0061); // 打印 a\u后面的为字符的 Unicode 码点 \u 后面4位 xxxx 但是这种写法只识别 \u0000 到 \UFFFF 之间的字符,超出需要使用两…