IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java自动装箱/拆箱 -> 正文阅读

[Java知识库]Java自动装箱/拆箱

自动装箱和自动拆箱

那么Java中有八大基本数据类型,byte、char、short、int、long、double、float、boolean。而它们有对应的包装类

Byte、Character、Short、Integer、Long、Double、Float、Boolean,这样通过包装后,它们就成为了引用数据类型

那么基本数据类型怎么变成对应的包装类呢?

手动装箱

在jdk1.5之前呢,是没有自动装箱的功能的,那么只能由我们编写代码手动装箱!将int类型装箱为Integer类型

public void test() {
        int i = 10;
    // 手动装箱
        Integer a = new Integer(i);
    // 手动拆箱
        int i1 = a.intValue();
        System.out.println(i1);
}

自动装箱

我们就拿Integer为例,在jdk5之后就有了自动装箱/拆箱功能

public void test() {
    // 自动装箱,底层使用的是Integer.valueOf(10)方法,返回一个Integer对象
       Integer a = 10;
    // 自动拆箱,底层使用的是Integer.intValue()方法
       int b = a;
}

通过字节码的角度我们可以看得更加清晰!

?我们来看看这个Integer.valueOf()方法为我们做了些什么,点进源码中

public static Integer valueOf(int i) {
    // 首先它会去缓存中查看是否有这个值
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            // 缓存中有直接返回缓存中的值
            return IntegerCache.cache[i + (-IntegerCache.low)];
    // 否则直接返回这个包装后的对象
        return new Integer(i);
    }

这个缓存池中的范围是多少呢?

?那么从源码中看出缓存的数据为[-128,127],则从缓存中获取对象,那么现在来做一道笔试题

public void test() {
    Integer a = new Integer(3);
    Integer b = new Integer(3);
    System.out.println(a == b);
    
    Integer c = 3;
    Integer d = 3;
    System.out.println(c == d);
    
    Integer e = 128;
    Integer f = 128;
    System.out.println(e == f);
}

问输出结果是多少?那么这题呢第一个输出为false,第二个输出为true。因为对象a和对象b都是以new的方式创建对象,

不会从缓存中获取对象,那么这两个是不同的对象,即使它们的值都一样!

对象c和对象d就是自动装箱的过程,其底层会调用Integer.valueOf()方法,从缓存池中获取对象,其底层缓存池是从类加载的时候就存在的

 static final Integer cache[];  		// static和fianl修饰的缓存池

那么从中获取的两个对象也必定相同!

对象e和对象f,因为超过了缓存池中的范围,它就直接返回一个Integer对象,那么调用两次肯定是不同的对象,所以返回false。

自动拆箱

其底层是使用了intValue()方法,我们点进源码中

?

?可以看见,其返回的是一个int值,那么我们就很清楚为什么它可以直接赋值给int类型了,其底层就是调用了intValue()方法自动拆箱。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-31 23:49:43  更:2022-03-31 23:51:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:40:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码