目录

什么是装箱、拆箱

基本类型和包装类型

为什么会有基本类型?

为什么还要有包装类型

两者区别

两者互转

源码分析(JDK1.8版本)

valueOf方法

1.Integer、Short、Byte、Character、Long的valueOf方法

2.Double、Float的valueOf方法

xxxValue方法


什么是装箱、拆箱

装箱:把基本数据类型转换成对应的包装类型
拆箱:把包装类型转化成基本数据类型

基本类型和包装类型

java中提供了8中基本数据类型,每种基本类型都对应一种包装类型

为什么会有基本类型?

Java是面向对象编程的语言,而基本类型并不是对象,为什么会存在基本类型呢?

Java通过new创建对象,对象存储在堆里,我们通过栈中的引用来使用该对象。但Java中绝大部分对象是朝生夕死的,这样就会有大量对象的创建和回收,效率低下。所以对于频繁使用的一些类型,就不用关键字new来创建,直接将变量值存储在栈中更为高效。

为什么还要有包装类型?

既然基本类型那么高效,那为什么还要有它们的包装类型呢?

为了使基本类型具有对象特征,从而实现更多的功能。因为类能够提供必要的方法,用于实现基本数据类型的数值与String之间的转换,以及一些其他属性和方法; 另外,有些数据结构库类(如集合类型Collection、Map)只能操作对象,而不支持基本数据类型的变量,包装类提供一种便利的方式,能够把基本数据类型转换成等价的对象,从而可以利用数据结构库类进行处理。

两者区别

1. 声明方式不同:基本类型不使用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间;
 
2. 存储方式及位置不同:基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中,然后通过引用来使用;
 
3. 初始值不同:基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null;
 
4. 使用方式不同:基本类型直接赋值直接使用就好,而包装类型在集合如Collection、Map时会使用到。

由于java提供了默认box unbox操作,所以在大数据和高并发场景下,需注意性能。

两者互转

基本类型转包装类型:valueOf()

包装类型换基本类型:xxxValue()  。(xxx代表对应的基本数据类型)

源码分析(JDK1.8版本)

valueOf方法

1.Integer、Short、Byte、Character、Long的valueOf方法

Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的(在某个范围内的数值的个数是有限的),以Integer为例

这行代码的意思是,如果int值在[-128, Integer.IntegerCache.high](Integer.IntegerCache.high一般为127)区间内,则直接从Integer.IntegerCache.cache里取,否则新创建一个对象。

接下来看看IntegerCache是怎样的

从这段代码可以看出,IntegerCache的作用就是预先创建并缓存一定范围内的Integer对象[-128, high],high值可以通过调整虚拟机系统参数来改变,但-128~127一定会被缓存。此处需注意:这表明通过装箱操作即valueOf方法得到的指定int值的包装对象,都是同一个对象,反之,则不是同一个对象。

2.Double、Float的valueOf方法

以Double为例

这表明通过装箱操作得到的每个Double对象都是不同的对象。

3.Boolean的valueOf方法

这表明通过装箱操作得到的所有true值的Boolean对象都是同一个对象,所有的false值的Boolean对象都是同一个对象。

xxxValue方法

包装类型通过value属性来保存基本类型的值。xxxValue方法直接返回value的值。

JDK--box和unbox的更多相关文章

  1. c# dynamic,maybe I should say it is just some shortcut for "Object", box and unbox, without the cast

    dynamic: void Main() { var b="2"; dynamic a="2"; if(a.GetType()==typeof(int))b+= ...

  2. 你不知道的JavaScript(六)Box&Unbox

    很多语言中都有Box和Unbox的概念,很多书籍把Box翻译为"装箱操作",指的是將基本数据类型包装成对象:Unbox和它相反,把对象类型转换为基本类型. 我们知道JavaScri ...

  3. 【java基础之jdk源码】Object

    最新在整体回归下java基础薄弱环节,以下为自己整理笔记,若有理解错误,请批评指正,谢谢. java.lang.Object为java所有类的基类,所以一般的类都可用重写或直接使用Object下方法, ...

  4. JVM锁简介:偏向锁、轻量级锁和重量级锁

    转自:https://www.aimoon.site/blog/2018/05/21/biased-locking/ 比较复杂,简略见另一篇:https://www.cnblogs.com/twohe ...

  5. hashCode和identityHashCode底层是怎么生成的

          前言:在工作中使用==埋下的坑这篇博文的最后,我想到了两个问题,其中一个是——为什么 int int1=99;int int2=99;int1和int2的identityHashCode是 ...

  6. Java中Object类hashCode的底层实现

    Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ...

  7. .NET面试题系列[4] - C# 基础知识(2)

    2 类型转换 面试出现频率:主要考察装箱和拆箱.对于有笔试题的场合也可能会考一些基本的类型转换是否合法. 重要程度:10/10 CLR最重要的特性之一就是类型安全性.在运行时,CLR总是知道一个对象是 ...

  8. CLR via C# 摘要二:IL速记

    最简单的IL程序 .assembly test {} .method void Func() { .entrypoint ldstr "hello world" call void ...

  9. Scala HandBook

    目录[-] 1.   Scala有多cool 1.1.     速度! 1.2.     易用的数据结构 1.3.     OOP+FP 1.4.     动态+静态 1.5.     DSL 1.6 ...

  10. Emit学习(2) - IL - 常用指令介绍

    学习Emit必不可少的, 会使用到IL中间代码. 初见IL代码, 让我有一种汇编的感觉, 让我想起了, 大学时, 学习8051的汇编语言. 多的就不扯了, 直接进入正题, OpCodes指令集是不是有 ...

随机推荐

  1. Java开源生鲜电商平台-盈利模式详解(源码可下载)

    Java开源生鲜电商平台-盈利模式详解(源码可下载) 该平台提供一个联合买家与卖家的一个平台.(类似淘宝购物,这里指的是食材的购买.) 平台有以下的盈利模式:(类似的平台有美菜网,食材网等) 1. 订 ...

  2. 如何使用php生成唯一ID的4种方法

    php生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID.由于生成唯一ID与微秒时间关联,因此ID的唯一性非常 ...

  3. Myeclipse使用git

    推荐使用服务器:coding,coding的上传很稳定很快 怎么建仓库: coding 这个服务器呢有个很明显的东西就是太的语言可以是中文的, 点头标签的加号就能进行创建仓库了 点击新建就行了 点击这 ...

  4. java.util.logging的使用

    秉承着某种执念我今天决定不用Logback而是和Java的logging肛到底,现在总结一下研究成果: 日志等级 日志等级有七种,severe,warning,info,fine,finer,fine ...

  5. [ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis

    上一章 [ 搭建Redis本地服务器实践系列一 ] :图解CentOS7安装Redis 详细的介绍了Redis的安装步骤,那么只是安装完成,此时的Redis服务器还无法正常运作,我们需要对其进行一些配 ...

  6. PAT1011:World Cup Betting

    1011. World Cup Betting (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Wit ...

  7. SAP系统三层架构

    SAP系统三层架构:表示层,应用层,数据库层   表示层:也可以说个人用户client.由表示层提出数据请求,然后应用层对请求进行处理,再通过数据库层DBMS系统对数据进行处理.   从应用服务器的缓 ...

  8. ps命令手册

    LINFO ps命令   在PS(即,处理状态)命令被用来提供关于当前正在运行的信息的过程,包括它们的过程标识号(PID)来. 过程也称为任务,是程序的执行(即运行)实例.系统为每个过程分配一个唯一的 ...

  9. jenkins+gitlab自动化编译部署方案探索及服务端编译webpack实战

    一. 背景 之前我们的开发流程为在本地进行webpack打包编译,然后svn提交源代码和编译后的代码.同时每次提交前也会从svn更新源代码和编译后的代码.这样做有几个缺点: 1. svn 更新和提交编 ...

  10. Step by step guide to set up master and slave machines on Windows

    Note: There is no need to install Jenkins on the slave machine. On your master machine go to Manage ...