JDK--box和unbox
目录
1.Integer、Short、Byte、Character、Long的valueOf方法
什么是装箱、拆箱
装箱:把基本数据类型转换成对应的包装类型
拆箱:把包装类型转化成基本数据类型
基本类型和包装类型
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的更多相关文章
- 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+= ... 
- 你不知道的JavaScript(六)Box&Unbox
		很多语言中都有Box和Unbox的概念,很多书籍把Box翻译为"装箱操作",指的是將基本数据类型包装成对象:Unbox和它相反,把对象类型转换为基本类型. 我们知道JavaScri ... 
- 【java基础之jdk源码】Object
		最新在整体回归下java基础薄弱环节,以下为自己整理笔记,若有理解错误,请批评指正,谢谢. java.lang.Object为java所有类的基类,所以一般的类都可用重写或直接使用Object下方法, ... 
- JVM锁简介:偏向锁、轻量级锁和重量级锁
		转自:https://www.aimoon.site/blog/2018/05/21/biased-locking/ 比较复杂,简略见另一篇:https://www.cnblogs.com/twohe ... 
- hashCode和identityHashCode底层是怎么生成的
		前言:在工作中使用==埋下的坑这篇博文的最后,我想到了两个问题,其中一个是——为什么 int int1=99;int int2=99;int1和int2的identityHashCode是 ... 
- Java中Object类hashCode的底层实现
		Java中Object类hashCode的底层实现 openjdk\jdk\src\share\native\java\lang\Object.c 42 static JNINativeMethod ... 
- .NET面试题系列[4] - C# 基础知识(2)
		2 类型转换 面试出现频率:主要考察装箱和拆箱.对于有笔试题的场合也可能会考一些基本的类型转换是否合法. 重要程度:10/10 CLR最重要的特性之一就是类型安全性.在运行时,CLR总是知道一个对象是 ... 
- CLR via C# 摘要二:IL速记
		最简单的IL程序 .assembly test {} .method void Func() { .entrypoint ldstr "hello world" call void ... 
- Scala HandBook
		目录[-] 1. Scala有多cool 1.1. 速度! 1.2. 易用的数据结构 1.3. OOP+FP 1.4. 动态+静态 1.5. DSL 1.6 ... 
- Emit学习(2) - IL - 常用指令介绍
		学习Emit必不可少的, 会使用到IL中间代码. 初见IL代码, 让我有一种汇编的感觉, 让我想起了, 大学时, 学习8051的汇编语言. 多的就不扯了, 直接进入正题, OpCodes指令集是不是有 ... 
随机推荐
- 大数据征信的应用和启示:ZestFinance的基于大数据的信用评估技术
			http://www.d1net.com/bigdata/news/325426.html 2014年11月,本文作者有机会和ZestFinance的创始人和首席执行官梅里尔(Douglas C.Me ... 
- CSS后代选择器“空格”和“>”的使用辨析
			要点: 1. "空格":包含子孙 2. ">":含子不含孙 举个栗子: html代码如下 <body> <div class=" ... 
- Hibernate JPA 动态criteria语句针对null查询条件的特殊处理
			最近原Hibernate项目需要添加一个条件,结构有点类似下面的格式,学生和房间是多对一的关系,现在要查询所有没有房间的学生. Class Student{ @ManyToOne Room room; ... 
- PhpStorm服务激活
			日期 服务地址 状态 2018-03-15 http://idea.singee77.com/ 使用中 
- codechef Chef And Easy Xor Queries
			做法:我们考虑前缀异或和,修改操作就变成了区间[i,n]都异或x 查询操作就变成了:区间[1,x]中有几个k 显然的分块,每个块打一个tag标记表示这个块中所有的元素都异或了tag[x] 然后处理出这 ... 
- 关于cannot find module 'xxxx’的一个可能解决方法。
			关于cannot find module 'xxxx'的一个可能解决方法. 由于学习angular2,想单独学习一下typescript下angular2使用的'rxjs'是怎么使用的,我用npm自己 ... 
- C#高级编程笔记之第一章:.NET体系结构
			1.1 C#与.NET的关系 C#不能孤立地使用,必须与.NET Framework一起使用一起考虑. (1)C#的体系结构和方法论反映了.NET基础方法论. (2)多数情况下,C#的特定语言功能取决 ... 
- Oracle数据库逻辑迁移之数据泵的注意事项
			环境:数据迁移,版本 11.2.0.4 -> 12.2.0.1 思考: 对于DBA而言,常用物理方式的迁移,物理迁移的优势不必多说,使用这种方式不必担心对象前后不一致的情况,而这往往也解决了不懂 ... 
- CSS定位使用方法
			.box0 { width: 200px; height: 200px; position: relative; background: #cfa } .box0-1,.box0-2 { width: ... 
- FLASK  使用方法
			Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档,大部分代码引用自官方文档. 安装Flask 首先我们来安装F ... 
