基本类型、包装类型与自动拆装箱

2023-11-12

Java的8种数据类型

Java 的每个基本类型都对应了一个包装类型,比如说 int 的包装类型为 Integerdouble 的包装类型为 Double

基本类型 包装类
boolean Boolean
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character

为什么要有包装类

Java是一种面向对象的语言,而基本数据类型不属于对象,这给Java程序造成了一定的困难。因此,Java提供了封装类型,将基本数据类型包装成对象,并提供了自动拆装箱机制,使得基本数据类型可以作为对象被传递。

基本类型与包装类型的区别

二者初始值不同

包装类型可以为null,而基本类型不可以。
它使得包装类型可以应用与POJO中,而基本类型不行。

POJO(Plain Ordinary Java Object)简单的Java对象,只有属性字段以及 settergetter 方法,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。

//POJO实例
class Writer {
    private Integer age;
    private String name;

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

为什么 POJO 的属性必须要用包装类型?
数据库的查询结果可能是null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把 Integer 对象转换成int值),就会抛出 NullPointerException的异常。

二者声明方式不同

包装类创建的是对象,而基本类型不是。
基本类型不使用new关键字,而包装类型使用new关键字分配存储空间。

二者存储区域不同

基本类型分配在栈内存,对象存储于堆内存。

int a=1;
Integer a =new Integer(1);

由于在堆内存分配空间所需时间远大于栈内存,基本类型分配空间所需时间更少,更高效。

二者存储内容不同

基本类型一般保存为数值;
而对象保存的是对象的地址。

二者使用方法不同

  1. 集合类中只能使用包装类,但基本类型可以自动装箱。
  2. 泛型中只能使用包装类,不可使用基本类型。
List<int> list = new ArrayList<>();
 // 提示 Syntax error, insert "Dimensions" to complete ReferenceType
List<Integer> list = new ArrayList<>();
  1. 反射调用函数中使用包装类。
  2. 数据库查询结果为null时,无法赋值给基本类型,只能使用包装类。

自动拆装箱

自动拆装箱主要应对基本类型与包装类型的相互转换问题。

将基本类型转换成包装类型的过程叫做装箱。
反之,将包装类型转换成基本类型的过程叫做拆箱。

Java SE5 之前,开发人员要手动进行装拆箱

Integer chenmo = new Integer(10);  // 手动装箱
int wanger = chenmo.intValue();  // 手动拆箱

Java SE5 为了减少开发人员的工作,提供了自动装箱与自动拆箱的功能。

Integer chenmo  = 10;  // 自动装箱
int wanger = chenmo;     // 自动拆箱

//等价于

Integer chenmo = Integer.valueOf(10);
int wanger = chenmo.intValue();

也就是说,自动装箱是通过 Integer.valueOf()完成的;
自动拆箱是通过 Integer.intValue()完成的。

缓存池

当需要进行自动装箱时,如果数字在 -128 至 127 之间时,会直接使用缓存池中的对象,而不是重新创建一个对象。


// 1)基本类型和包装类型
int a = 100;
Integer b = 100;
System.out.println(a == b);//true

// 2)两个包装类型
Integer c = 100;
Integer d = 100;
System.out.println(c == d);//true

// 3)
Integer c = 200;
Integer d = 200;
System.out.println(c == d);//false

除了FloatDouble之外,其他六个包装类都有常量缓存池 。

当然,这个问题只会发生在装箱时,也就是调用valueOf方法时。
如果没有触发装箱操作时,不论值是否相等,新建对象的==比较都是false。

Integer a1 = 1;//调用Integer.valueOf()自动装箱
Integer b1 = 1;//调用Integer.valueOf()自动装箱
Integer c1 = 300;//调用Integer.valueOf()自动装箱
Integer d1 = 300;//调用Integer.valueOf()自动装箱
System.out.println(a1==b1);//true
System.out.println(c1==d1);//false
 
Integer a2 = Integer.valueOf(1);//手动装箱
Integer b2 = Integer.valueOf(1);//手动装箱
Integer c2 = Integer.valueOf(300);//手动装箱
Integer d2 = Integer.valueOf(300);//手动装箱
System.out.println(a2==b2);//true
System.out.println(c2==d2);//false
 
// 构造器传值,并没有调用valueOf方法,所以也没有缓冲池
 
Integer a3 = new Integer(1);//新建对象
Integer b3 = new Integer(1);//新建对象
Integer c3 = new Integer(300);//新建对象
Integer d3 = new Integer(300);//新建对象
System.out.println(a3==b3);//false
System.out.println(c3==d3);//false
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基本类型、包装类型与自动拆装箱 的相关文章

  • Java操作Excel文件

    创建一个Excel文件 public static void creatExcelFile String filepath Workbook wb new XSSFWorkbook try FileOutputStream fileOut
  • 黑马程序员---从头开始,回忆JAVA基础之JAVA用十六进制表示浮点数的方法

    在二进制文件中 存储数据的格式为16进制 下面举例说明27 0f在二进制文件中怎么表示 float 共计32位 折合4字节 由最高到最低位分别是第31 30 29 0位 31位是符号位 1表示该数为负 0反之 30 23位 一共8位是指数位
  • JVM工具-jstack

    jstack 打印线程堆栈信息 支持支持本地java进程 core文件以及远程java进程 命令格式 jstack options pid jstack options executable core jstack options serv
  • 根据图片地址得到文件流

    得到文件流 param url 图片地址 return public static byte getFileStream String url try URL httpUrl new URL url HttpURLConnection co
  • JAVA: quakus程序运行

    mvnw compile quarkus dev
  • 什么是多态?对于多态的理解....

    什么是多态 我们都知道面向对象有四个基本特性 抽象 封装 继承 多态 概括可以理解为 抽象 封装 继承 是多态的基础 多态是抽象 封装 继承的表现 多态 是Java中非常重要的一部分 简单理解 不同类的 对象 对同一消息 做出了不同的响应就
  • 【一】第一个java程序详解

    第一个java程序详解 一 前言 二 创建并编写java源代码的文件 创建java源代码文件 更改文件后缀 java代码的结构 三 编译执行 编译 执行 四 总结 五 附 java关键字 一 前言 通过之前上一节 开篇 Java语言介绍及环
  • 使用jemeter进行压力测试关注的指标

    一 压测设置 线程数 并发数量 能跑多少量 具体说是一次存在多少用户同时访问 Rame Up Period in seconds 表示JMeter每隔多少秒发动并发 理解成准备时长 设置虚拟用户数需要多长时间全部启动 如果线程数是20 准备
  • Java特训的第一天——开篇

    我是一名刚入门的Java菜鸟 我选择Java的原因是因为其语法简单 功能强大 从web 到桌面 到嵌入式 无所不能 下面我将谈一谈我对Java语言的认识 Java语言概述 关于Java的介绍网上有很详细的阐述 我在这里就不再细述了 下面只简
  • 7.java类中的方法

    1 类中的方法 1 实例方法 格式 访问限制修饰符 方法的返回值数据类型 方法名称 参数列表 方法体 解释 访问限制修饰符 public 缺省的 方法的返回值数据类型 就是方法的执行结果类型 有返回值时 方法的返回值数据类型一定是方法执行结
  • java Map集合

    目录 一 介绍 二 HashMap 三 TreeMap 四 LinkedHashMap 一 介绍 Java中的Map是一种键值对的集合数据类型 用于存储无序的 不重复的键值对 它提供了快速的查找和访问功能 可以根据键来获取值 常见的Map实
  • ThreadLocal学习

    1 threadLocal图解 java lang ThreadLocal类实现了线程的本地存储 ThreadLocal的内部实现 ThreadLocal的内部实现包括一个类似HashMap的对象 这里称之ThreadLocalMap Th
  • 一文彻底弄懂零拷贝原理

    零拷贝 零拷贝 Zero Copy 是一种 I O 操作优化技术 可以快速高效地将数据从文件系统移动到网络接口 而不需要将其从内核空间复制到用户空间 其在 FTP 或者 HTTP 等协议中可以显著地提升性能 但是需要注意的是 并不是所有的操
  • POI解析word\pdf中表格

  • JAVA,异常

    异常概念 通常大家认为异常就是错误 但这个错误有很多种 1 语法错误 2 JVM虚拟机错误 3 平台错误 4 程序运行错误 平台或者资源或者逻辑 数值等错误 常见的异常 1 java lang NullPointerException 空指
  • MVC模型图

    MVC图
  • jeecgboot问题解决方案

    常见问题Q A JEECG老版在线文档 点击进入 1 后台访问提示token错误 报错截图 解决方案 JeecgBoot后台的所有请求访问 增加了token机制 所以不能直接访问后台 而需要通过前台登录才能访问 默认前台访问地址 http
  • JAVA--GUI(2)--布局

    布局 为了更好适应不同平台而引入的概念 Java的布局管理器是一个实现了LayoutManager接口的实例 用户无法设置setLocation 这些方法 如果想自己设置则需要取消布局管理器 采用布局管理器 边界布局 顺序布局 网格布局 卡
  • 多线程下载文件(支持暂停、取消、断点续传)

    多线程下载文件 支持暂停 取消 断点续传 多线程同时下载文件即 在同一时间内通过多个线程对同一个请求地址发起多个请求 将需要下载的数据分割成多个部分 同时下载 每个线程只负责下载其中的一部分 最后将每一个线程下载的部分组装起来即可 涉及的知
  • 黑豹程序员-统一身份认证接口

    术语和定义 1 IAM Identity Access Manager 统一身份认证系统 2 IDM Identity Manager 身份管理 3 SSO Single Sign On 单点登录 4 AD Active Directory

随机推荐

  • Java项目:眼镜商城系统(java+SSM+JSP+jQuery+Mysql)

    源码获取 俺的博客首页 资源 里下载 项目介绍 管理员角色包含以下功能 管理员登录 管理员管理 管理商城会员 新闻公告管理 眼睛类型管理 城市信息管理 连锁配镜店管理 眼镜商品管理 用户订单管理 管理用户的评价信息等功能 用户角色包含以下功
  • 蓝桥杯2013年第四届真题-公式求值

    题目描述 输入n m k 输出下面公式的值 其中C n m是组合数 表示在n个人的集合中选出m个人组成一个集合的方案数 组合数的计算公式如下 输入格式 输入的第一行包含一个整数n 第二行包含一个整数m 第三行包含一个整数k 数据规模和约定
  • 通过H5(浏览器/WebView/其他)唤起本地app

    前两天接到一个无线的需求 我这个小白可是忙活了好几天 在页面上有一个连接 如果用户安装了APP 则点击打开对应的APP如果用户没有安装 则点击打开对应的设置连接 上网搜索了一下 基本都说可以实现 但是实际情况却不乐观 当然只是其中的一个需求
  • Http的body变空格的问题解决方案

    最近在做iOS的内购功能 需要把内购的凭证转化为base64传给服务器 服务器再去AppStore的接口进行二次验证 这中间有一个问题是base64编码的字符串里有 号 这样的字符 传到服务器上 号 字符就变成空格字符了 原因是我们在进行h
  • 建设数据仓库的八个步骤

    摘要 建立数据仓库是一个解决企业问题的过程 业务人员往往不懂如何建立和使用数据仓库 发挥其决策支持的作用 信息部门的人员往往又不懂业务 不知道应该建立哪些决策主题 关键词 数据仓库 元数据 建设数据仓库 建立数据仓库是一个解决企业问题的过程
  • Windows下搭建FTP服务器

    一 什么是ftp FTP 是File Transfer Protocol 文件传输协议 的英文简称 而中文简称为 文传协议 用于Internet上的控制文件的双向传输 同时 它也是一个应用程序 Application 基于不同的操作系统有不
  • 课程笔记1

    一 密码学原理 1 密码学中的哈希函数被称为cryptographic hash function 它具有三点性质 1 哈希碰撞 collision resistance 对于不相等的x和y 对应的哈希值H x H y 没有有效的办法人为地
  • VMWare Fusion虚拟机安装与配置教程

    很多时候 我们都有用虚拟机的需求 比如用着Mac突然有一个软件只支持Windows 并且还需要与macOS上的软件搭配使用 况且你没有Windows电脑 这个时候虚拟机就能帮上大忙 在macOS上 笔者用的是MacBook Air 所以这里
  • 刷脸支付不需要媒介将进一步推动消费升级

    从现金 银行卡 到现在的手机支付移动支付 支付媒介不断发生变化 并最终以手机这样的通用媒介代替了现金 银行卡这样的专用媒介 同时也是一个逐渐脱媒的过程 现在支付宝主推的刷脸支付则相当于在用户端完全不再需要媒介 这也将进一步推动消费升级 4月
  • Vue中如何定义一个全局变量(Trick)

    img class lazyload lazybanner 页面中图片使用懒加载 默认图片想通过全局变量实现 实现方案 Vue filter default img function str return 你的图片路径 img class
  • 【CSDN竞赛第17期】简要题解 92.5分

    目录 1 判断胜负 简单字符串 题目 题解 比赛时代码 2 买铅笔 简单算数 题目 题解 代码 3 拯救爱情 得分70 题目 题解 比赛时代码 4 拯救公主 中国剩余定理 或 模拟 题目 题解 模拟 中国剩余定理 比赛时代码 1 判断胜负
  • mongo 复制一个表的数据到另一个表中

    club表 id ObjectId 592e94fee820cc1813f0b9a2 id 1 name test club preload 表 id ObjectId 592e94fee820cc1813f07383 club id 1
  • 使用python爬取英雄联盟官方英雄皮肤图片

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 版权归原作者所有 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击即可
  • EA使用教程

    文章目录 创建新工程 属性设置 导出图片到剪切板 时序图中取消消息后面自动生成的括号 在文本框中回车 取消流程图的背景渐变 导出更清晰图片 组合片段 设置字体和字体大小 官方教程地址 https sparxsystems cn enterp
  • 详解C#中的反射

    反射 Reflection 2008年01月02日 星期三 11 21 两个现实中的例子 1 B超 大家体检的时候大概都做过B超吧 B超可以透过肚皮探测到你内脏的生理情况 这是如何做到的呢 B超是B型超声波 它可以透过肚皮通过向你体内发射B
  • Web开发中的AJAX技术介绍

    读音 e j ks AJAX即 Asynchronous JavaScript and XML 异步JavaScript和XML AJAX并非缩写词 而是由Jesse James Gaiiett创造的名词 是指一种创建交互式网页应用的网页开
  • 软件大厂,环境检测思路和规避思路,安卓改机应该改什么数据和参数,安卓boot内核修改 环境检测对抗 部分参数解析

    前言 现在大厂的设备指纹层出不穷 但是想要确保稳定性和唯一性高精准其实也挺难的一件事 有的是通过设备信息比重进行的设备ID唯一值确认 比如A设备信息占比10 B设备信息占比20 当比重超过60 以上 设备指纹才会发生变化 这样的好处就是当你
  • Mybatis学习笔记--2:CRUD操作与动态代理

    增删改查对应Mapper配置文件里的标签 select update delete insert 1 封装MyBatisUtils工具类 public class MybatisUtils public static final SqlSe
  • const、指针、引用的关系

    const 指针 引用的关系 const 与指针 const 与引用 const 与指针 引用 const 与指针 我们写一段代码来探究以下 int a 10 b 20 int p1 a p1 100 p1 b const int p2 a
  • 基本类型、包装类型与自动拆装箱

    Java的8种数据类型 Java 的每个基本类型都对应了一个包装类型 比如说 int 的包装类型为 Integer double 的包装类型为 Double 基本类型 包装类 boolean Boolean byte Byte short