JDK源码阅读-------自学笔记(十)(java.lang.Integer包装类初探)
自动装箱和拆箱
- 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包装类初探)的更多相关文章
- JDK源码阅读-------自学笔记(一)(java.lang.Object重写toString源码)
一.前景提要 Object类中定义有public String toString()方法,其返回值是 String 类型. 二.默认返回组成 类名+@+16进制的hashcode,当使用打印方法打印的 ...
- JDK源码阅读-------自学笔记(二十五)(java.util.Vector 自定义讲解)
Vector 向量 Vector简述 1).Vector底层是用数组实现的List 2).虽然线程安全,但是效率低,所以并不是安全就是好的 3).底层大量方法添加synchronized同步标记,sy ...
- JDK源码阅读-------自学笔记(五)(浅析数组)
一.数组基础 1.定义和特点 数组也可以看做是对象,数组变量属于引用类型,数组中每个元素相当于该队形的成员变量,数组对象存储在堆中. 2.初始化数组 常用类初始化 // 整型初始化 int[] int ...
- JDK源码阅读-------自学笔记(二十四)(java.util.LinkedList 再探 自定义讲解)
一.实现get方法 1.一般思维实现思路 1).将对象的值放入一个中间变量中. 2).遍历索引值,将中间量的下一个元素赋值给中间量. 3).返回中间量中的元素值. 4).示意图 get(2),传入角标 ...
- JDK源码阅读-DirectByteBuffer
本文转载自JDK源码阅读-DirectByteBuffer 导语 在文章JDK源码阅读-ByteBuffer中,我们学习了ByteBuffer的设计.但是他是一个抽象类,真正的实现分为两类:HeapB ...
- JDK源码阅读(三):ArraryList源码解析
今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 ...
- JDK源码阅读(一):Object源码分析
最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...
- 利用IDEA搭建JDK源码阅读环境
利用IDEA搭建JDK源码阅读环境 首先新建一个java基础项目 基础目录 source 源码 test 测试源码和入口 准备JDK源码 下图框起来的路径就是jdk的储存位置 打开jdk目录,找到sr ...
- JDK源码阅读-FileOutputStream
本文转载自JDK源码阅读-FileOutputStream 导语 FileOutputStream用户打开文件并获取输出流. 打开文件 public FileOutputStream(File fil ...
- JDK源码阅读-FileInputStream
本文转载自JDK源码阅读-FileInputStream 导语 FileIntputStream用于打开一个文件并获取输入流. 打开文件 我们来看看FileIntputStream打开文件时,做了什么 ...
随机推荐
- Qt操作sqlite数据库
代码讲解: 1.检查数据库文件是否存在,如果不存在就创建数据库文件 2.创建 person 表(等下的操作就是操作这个表) 3.查询出 person 表中所有的数据,并显示出来 Pro 文件 添加 S ...
- js es6 Iterator
1.遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员). 2.Iterator ...
- Spring开发:动态代理的艺术与实践
本文分享自华为云社区<Spring高手之路17--动态代理的艺术与实践>,作者: 砖业洋__. 1. 背景 动态代理是一种强大的设计模式,它允许开发者在运行时创建代理对象,用于拦截对真实对 ...
- vue 商品sku添加,笛卡尔算法,商品添加。动态生成table,table添加值后 再生成的table 不改变table之前输入的值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JVM简明笔记1:JVM 概述
什么是JVM JVM 即 Java Virtual Machine,中文名为 Java虚拟机. 一般情况下 C/C++ 程序,编译成二进制文件后,就可以直接执行了: Java 需要使用 javac 编 ...
- 代码安全无忧—云效Codeup代码加密技术发展之路
简介: 从代码服务及代码安全角度出发,看看云效代码加密技术如何解决这一问题 代码数据存在云端,如何保障它的安全? 部分企业管理者对于云端代码托管存在一丝担心:我的代码存在云端服务器,会不会被泄露? 接 ...
- [Blockchain] Cosmos Starport 地址前缀的变更方式
# 在新的区块链上修改 starport app github.com/hello/planet --address-prefix your_new_prefix # 在已存在的区块链上修改 `app ...
- dotnet 使用 Newtonsoft.Json 输出枚举首字符小写
本文告诉大家如何使用 Newtonsoft.Json 输出枚举首字符小写 实现方法是加上 JsonConverterAttribute 特性,传入 StringEnumConverter 转换器,再加 ...
- UWP 写入图片 Exif 信息
本文告诉大家如何在 UWP 中,保存图片的时候,写入 Exif 信息,也就是如照片的 相机型号 制造商 光圈值等信息的写入 在 UWP 中,保存图片或照片需要用到图片编码器,在使用编码器写入前可以设置 ...
- 1.prometheus源码安装
一.prometheus安装前准备 prometheus官网:https://prometheus.io/ grafana官网:https://grafana.com/ 资源下载: # 1.资源下载 ...