自动装箱和拆箱

  • JDK1.5后,Java引入了自动装箱(autoboxing)/拆箱(unboxing)

自动装箱

  • 基本数据类型在需要时自动转化为对象

自动装箱

  • 对象在需要时自动转化为基本数据类型

注意:

  此处的自动是假自动,只是编译器替开发者做了一些事情而已.   也称为编译器蜜糖

实例自动装箱

1      // 界面书写方式
2 Integer baseDataTyeTranslation = 123;
3
4 // 实际编译器替开发的操作
5 Integer baseDataTyeTranslationFact = Integer.valueOf(123);

可以在生成的.class文件中查看

实例自动拆箱

1     // 编译器界面书写方式
2 Integer baseDataTyeTranslation = 123;
3
4 // 编译器界面拆箱
5 int autoBoxingInteger = baseDataTyeTranslation;
6
7 // 实际编译器替开发的操作
8 int autoBoxingIntegerFact = baseDataTyeTranslation.intValue();

可以在生成的.class文件中查看

经典错误自动拆箱1------空指针问题

1     // 初始化类型
2 Integer baseDataTyeTranslation = null;
3
4 // 赋值给基本数据类型
5 int autoBoxingIntegerFact = baseDataTyeTranslation;

报错:

1  Exception in thread "main" java.lang.NullPointerException at com.mr.test.AutoBoxingDemo1.main(AutoBoxingDemo1.java:13) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:564) at com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131)

因为在拆箱的时候,自动调用intValue()方法,而基本数据类型中没有null这个数值,所以,就会报错

解决方案
1     // 初始化类型
2 Integer baseDataTyeTranslation = null;
3
4 if (baseDataTyeTranslation != null) {
5 // 赋值给基本数据类型
6 int autoBoxingIntegerFact = baseDataTyeTranslation;
7 }

经典错误自动拆箱2--------缓存问题

1      // 初始化类型
2 Integer baseDataTyeTranslation1 = Integer.valueOf(-128);
3
4 Integer baseDataTyeTranslation2 = Integer.valueOf(-128);
5
6 System.out.println(baseDataTyeTranslation1 == baseDataTyeTranslation2);

返回结果是true,'=='比较的是对象的索引,而此处结果却是true,在[-128,127]区间的数,在创建对象的时候,是走缓存的,缓存时,先检测范围,如果是缓存范围内,就调用缓存对象,不是范围内,就新建对象。

源码:

1、-128-127走缓存

2、缓存中数据

3、在范围内,加入缓存中

改写方式:

 1 public class AutoBoxingDemo1{
2
3 public static void main(String[] args) {
4
5
6 // 初始化类型
7 Integer baseDataTyeTranslation1 = AutoBoxingDemo1.valueOf(-128);
8
9 Integer baseDataTyeTranslation2 = AutoBoxingDemo1.valueOf(-128);
10
11 System.out.println(baseDataTyeTranslation1 == baseDataTyeTranslation2);
12
13
14 }
15
16
17 public static Integer valueOf(int i) {
18 return new Integer(i);
19 }
20 }

JDK源码阅读-------自学笔记(十)(java.lang.Integer包装类初探)的更多相关文章

  1. JDK源码阅读-------自学笔记(一)(java.lang.Object重写toString源码)

    一.前景提要 Object类中定义有public String toString()方法,其返回值是 String 类型. 二.默认返回组成 类名+@+16进制的hashcode,当使用打印方法打印的 ...

  2. JDK源码阅读-------自学笔记(二十五)(java.util.Vector 自定义讲解)

    Vector 向量 Vector简述 1).Vector底层是用数组实现的List 2).虽然线程安全,但是效率低,所以并不是安全就是好的 3).底层大量方法添加synchronized同步标记,sy ...

  3. JDK源码阅读-------自学笔记(五)(浅析数组)

    一.数组基础 1.定义和特点 数组也可以看做是对象,数组变量属于引用类型,数组中每个元素相当于该队形的成员变量,数组对象存储在堆中. 2.初始化数组 常用类初始化 // 整型初始化 int[] int ...

  4. JDK源码阅读-------自学笔记(二十四)(java.util.LinkedList 再探 自定义讲解)

    一.实现get方法 1.一般思维实现思路 1).将对象的值放入一个中间变量中. 2).遍历索引值,将中间量的下一个元素赋值给中间量. 3).返回中间量中的元素值. 4).示意图 get(2),传入角标 ...

  5. JDK源码阅读-DirectByteBuffer

    本文转载自JDK源码阅读-DirectByteBuffer 导语 在文章JDK源码阅读-ByteBuffer中,我们学习了ByteBuffer的设计.但是他是一个抽象类,真正的实现分为两类:HeapB ...

  6. JDK源码阅读(三):ArraryList源码解析

    今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 ...

  7. JDK源码阅读(一):Object源码分析

    最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...

  8. 利用IDEA搭建JDK源码阅读环境

    利用IDEA搭建JDK源码阅读环境 首先新建一个java基础项目 基础目录 source 源码 test 测试源码和入口 准备JDK源码 下图框起来的路径就是jdk的储存位置 打开jdk目录,找到sr ...

  9. JDK源码阅读-FileOutputStream

    本文转载自JDK源码阅读-FileOutputStream 导语 FileOutputStream用户打开文件并获取输出流. 打开文件 public FileOutputStream(File fil ...

  10. JDK源码阅读-FileInputStream

    本文转载自JDK源码阅读-FileInputStream 导语 FileIntputStream用于打开一个文件并获取输入流. 打开文件 我们来看看FileIntputStream打开文件时,做了什么 ...

随机推荐

  1. #KM算法#UVA1411 Ants

    题目 在一个平面直角坐标系中,有 \(n\) 个黑点,\(n\) 个白点. 给出一种二分图匹配的方案,使得没有两条由黑白点连接的线段相交 分析 如果线段都不相交,根据三角形的两边之和大于第三边,那么线 ...

  2. 中文GPTS,字节中文扣子Coze使用全教程

    字节出自己的GPTS了,名字英文名叫coze,中文名叫"扣子".和OpenAI的GPTS类似.具有可定制性和完成特定任务的强大功能,它提供了一种新的GPT方式,可以让用户根据自己的 ...

  3. 上海站报名启动! 2023年开源产业生态大会OpenHarmony生态分论坛

      作为年内开源领域不容错过的科技盛宴,2023年开源产业生态大会将于12月19日在上海盛大开幕.本次活动由上海市经济和信息化委员会.上海市科学技术协会和"科创中国"开源创新联合体 ...

  4. 组合数学——Min-Max容斥

    Min-Max 容斥,即 $$\max(S)=\sum_{T\in S,T\neq\emptyset}(-1)^{|T|-1}\min(T)$$ 接下来证明上面那个式子是对的.定义 \(S\) 中共有 ...

  5. HarmonyOS Codelab 优秀样例——购物应用,体验一次开发多端部署魅力

    一. 样例介绍 本篇Codelab基于自适应布局和响应式布局,实现购物应用在手机.折叠屏.平板不同屏幕尺寸设备上按不同设计显示.通过三层工程结构组织代码,实现一次开发,多端部署 . 手机运行效果如图所 ...

  6. CTR预估系列模型漫谈

    FM FM的主要内容 了解fm模型之前,需要先说一下lr带入一下场景.lr作为早期ctr预估里面的模型,其速度上有着无可比拟的优势,而偏偏ctr场景下伴随着有大量的离散特征,高维稀疏特征,这个很适合l ...

  7. 重新点亮shell————sed的替换[十]

    前言 简单介绍一下sed 和 awk. 正文 这两个和vim的区别: vim 是交互式和 他们是非交互式 vim是文件操作模式与他们是行交互模式 sed sed 的 模式空间. sed的基本工作方式是 ...

  8. centos 虚拟机修改mac和ip地址

    前言 因为网上过于零散,故而整理.在此我用的是vm虚拟机. 正文 在我们安装好vm虚拟机后,我们会获得两个虚拟网卡. 那么我们获得两个虚拟网卡后,这两个网卡到底是什么呢?那么我们打开vm的虚拟网络编辑 ...

  9. canvas生成表单海报

    项目需要输入表单生成图片,可以使用下面方法生成海报,保存到手机,话不多说,上代码吧 HTML部分代码 <div class="dd"> <img src=&quo ...

  10. 精通中间件测试:Asp.Net Core实战指南,提升应用稳定性和可靠性

    引言 在上一章节我们实战了在Asp.Net Core中的项目实战,这一章节讲解一下如何测试Asp.Net Core的中间件. TestServer 还记得我们在集成测试中提供的TestServer吗? ...