目录

什么是装箱、拆箱

基本类型和包装类型

为什么会有基本类型?

为什么还要有包装类型

两者区别

两者互转

源码分析(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. 任务调度利器:Celery

    http://www.liaoxuefeng.com/article/00137760323922531a8582c08814fb09e9930cede45e3cc000 Celery是Python开 ...

  2. Spring Boot【快速入门】

    Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for building all Sp ...

  3. R语言学习 第十一篇:日期和时间

    R语言的基础包中提供了三种基本类型用于处理日期和时间,Date用于处理日期,它不包括时间和时区信息:POSIXct/POSIXlt用于处理日期和时间,其中包括了日期.时间和时区信息.R内部在存储日期和 ...

  4. activeMq的入门程序

    生产者 1.导入相关依赖 2.交给Spring管理,写入相关配置JmsTemplate @RunWith(SpringJUnit4ClassRunner.class) @ContextConfigur ...

  5. Java获取当日的起始时间,结束时间,现在时间,是否在时间段中。

    当日的起始时间 public static Date getTodayStartTime() { Calendar todayStart = Calendar.getInstance(); today ...

  6. EntityFramework 6.x和EntityFramework Core插入数据探讨

    前言 一直以来对EF和EF Core都是单独分开来写,从未以比较的形式来讲解,如果您既用过EF 6.x也用过用EF Core是否有了解过EF和EF Core在插入数据时和返回主键有何异同呢?本篇博客是 ...

  7. 拾人牙慧篇之———QQ微信的第三方登录实现

    一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...

  8. shiro 权限管理配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  9. JavaScrip对象

    一.JavaScript对象概述 JavaScript 中的所有事物都是对象:字符串.数值.数组.函数...此外,JavaScript 允许自定义对象.JavaScript 提供多个内建对象,比如 S ...

  10. Oracle12c中分区(Partition)新特性之TRUNCATEPARTITION和EXCHANGE PARTITION级联功能

    TRUNCATE [SUB]PARTITION和EXCHANGE [SUB]PARTITION命令如今可以包括CASCADE子句,从而允许参照分区表向下级联这些操作.为确保该选项正常,相关外键也必须包 ...