Java包装类

基本类型 大小 包装器类型
boolean / Boolean
char 16bit Character
byte 8bit Byte
short /16bit Short
int 32bit Integer
long 64bit Long
float 32bit Float
double 64bit Double
void / Void

Java 的包装类有两个主要的目的:

  • Java包装类将基本数据类型的值“包装”到对象中,对基本数据类型的操作变为了对对象进行操作,从而使基本值能够包含在为对象为保留的操作中。比如向Collections中添加元素(泛型的操作限制加入的只能是对象,比如List = new ArrayList() 的写法是错误的),或者从带对象返回值的方法中返回。
  • 更加方便类型的转换,如常见的Integer向字符的转换

装箱和拆箱

Java 在SE5之后提供了自动的装箱和拆箱机制。基本数据类型可以和与其对应的包装类之间自动进行转换
如:

Integer i = 10;
int index = i;

装箱就是自动将基本数据类型转换为包装器类型
拆箱就是自动将包装器类型装换为基本数据类型

在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。

其他的也类似,比如Double、Character,不相信的朋友可以自己手动尝试一下。

因此可以用一句话总结装箱和拆箱的实现过程:

装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的xxxValue方法实现的。(xxx代表对应的基本数据类型)。

面试问题

下面这段代码的输出结果是什么?

public class Main {public static void main(String[] args) {Integer i1 = 100;Integer i2 = 100;Integer i3 = 200;Integer i4 = 200;System.out.println(i1==i2);System.out.println(i3==i4);}
}

注意 ==和equals的区别:

类型 == equals
基本数据类型 不可用
包装类 地址 内容

输出的结果为:

true
false

为什么会出现这样的结果?输出结果表明 i1 和 i2 指向的是同一个地址,而 i3 和 i4 指向的是不同的地址。此时只需一看源码便知究竟,下面这段代码是Integer的valueOf方法的具体实现:

public static Integer valueOf(int i) {if(i >= -128 && i <= IntegerCache.high)return IntegerCache.cache[i + 128];elsereturn new Integer(i);}

从这2段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在 [-128,127] 之间,便返回指向IntegerCache.cache(常量池)中已经存在的引用;否则创建一个新的Integer对象。

上面的代码中 i1 和 i2 的数值为100,因此会直接从cache(常量池)中取已经存在的对象,所以 i1 和 i2 指向的是同一个对象,而 i3 和 i4 则是分别指向不同的对象。

推荐阅读!:更多关于基本数据类型在内存中存储过程底层的知识请参考另一篇文章:
[Java基础]从Java的各种基本数据类型看Java内存区域划分

  • 下面这段代码的输出结果是什么?
public class Main {public static void main(String[] args) {Double i1 = 100.0;Double i2 = 100.0;Double i3 = 200.0;Double i4 = 200.0;System.out.println(i1==i2);System.out.println(i3==i4);}
}

也许有的朋友会认为跟上面一道题目的输出结果相同,但是事实上却不是。实际输出结果为:

    falsefalse

至于具体为什么,读者可以去查看Double类的valueOf的实现。

在这里只解释一下为什么Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。

注意,Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的,因为他们都实现了常量池技术,Double、Float的valueOf方法的实现是类似的,并没有实现常量池技术。
Q:那么为什么这里要将值存储在常量池中呢?
A:速度更快,常量池引入的目的是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。这是一种 享元模式 的实现。

Java包装类及自动装箱、拆箱相关推荐

  1. java中为什么自动装箱拆箱_Java自动装箱和自动拆箱的理解

    Java自动装箱和自动拆箱的理解 1.代码 public class AutoBoxing { public static void main(String[] args) { Integer a = ...

  2. Java 128陷阱+自动装箱拆箱

    1.大纲概述 Int 整型为java八大基础类型之一,Integer是它的包装器类型:int的默认值为0,而Integer的默认值为null. 128陷阱:指 Integer类封装的数字在[-128, ...

  3. java 自动拆箱_Java中的自动装箱拆箱

    Java中的自动装箱拆箱 一.自动装箱与自动拆箱 自动装箱就是将基本数据类型转换为包装类类型,自动拆箱就是将包装类类型转换为基本数据类型. 1 //自动装箱 2 Integer total = 90; ...

  4. Java自动装箱/拆箱 - Java那些事儿

    昨天Java基本数据类型和引用类型一文中漏了几张图,已经补上,需要的自己回头去看,本系列文章首发于公众号:saysayJava. 在让人疑惑的Java代码 - Java那些事儿 一文中我们说到编译器自 ...

  5. Java自动装箱/拆箱

    自动装箱和自动拆箱 那么Java中有八大基本数据类型,byte.char.short.int.long.double.float.boolean.而它们有对应的包装类 Byte.Character.S ...

  6. Java基础笔记 – 增强的for循环For each循环 自动装箱拆箱 可变参数

    1.For each循环:1.1.语法:1.2.For each循环的使用:1.3.嵌套For each循环:1.4.三种循环遍历集合的列举:1.5.增强的for循环的缺点:2.自动装箱/拆箱(Aut ...

  7. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法?

    参考:http://blog.csdn.net/mazhimazh/article/details/16799925 1. Java八种基本数据类型的大小,以及封装类,自动装箱/拆箱的用法? 原始类型 ...

  8. java自动装箱拆箱原理

    java自动装箱拆箱原理 看了很多博主都没写原理,只是浅显地说了自动装箱拆箱的含义,我就把这个必须知道的知识写一下吧 1.自动装箱 以int -> Integer为例,Integer integ ...

  9. Java 8 自动装箱拆箱效率影响测试

    Java 8 自动装箱拆箱效率影响测试 测试完毕之后的结论:   1. 装箱发生 232−12^{32-1}232−1 次的时候影响时间大概为10秒   2. 拆箱发生 232−12^{32-1}23 ...

  10. java自动装箱拆箱深入剖析

    这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆:  java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装 ...

最新文章

  1. machine learning
  2. 【组合数学】生成函数 ( 换元性质 | 求导性质 | 积分性质 )
  3. 福建2020年3月计算机二级报名时间,福建2020年3月计算机二级考试报名时间安排...
  4. java 信使服务_java – 自行车信使/ TSPPD与OptaPlanner
  5. 简而言之Java.io:22个案例研究
  6. [luoguP2324] [SCOI2005]骑士精神(A*?)
  7. 吉隆坡强制所有餐馆明年必须设有无线上网服务
  8. Java集合——题目
  9. 基于alpine用dockerfile创建的ssh镜像
  10. 开发板与虚拟机tftp服务器安装与使用
  11. Spring boot 开发 GA/T1400 协议之注册、保活、注销、校时功能
  12. apple iphone 3gs 有锁机 刷机 越狱 解锁 全教程(报错3194,3014,1600,短信发不出去等问题可参考)...
  13. 利用在线词典批量查询英语单词
  14. 计算机演示文稿操作,计算机操作与应用 PowerPoint 演示文稿的设计与制作.ppt
  15. 网络系统实现技术--AppleTalk
  16. win怎么查看显示器大小,显示器是多少寸,查看显示器尺寸
  17. 分支定界法 python_分支定界(Branchbound)算法
  18. InternalError: Failed to create session.錯誤及解決方式
  19. PCIe扫盲——热插拔简要介绍
  20. 迅为嵌入式linux驱动开发笔记(十一)—触摸屏驱动

热门文章

  1. 【论文写作】本科、硕士研究生毕业论文字体、段落格式参考
  2. 【云图】如何制作东莞酒店地图?
  3. 阿里云大数据ACP(一)大数据开发平台 DataWorks
  4. 超级实用案例,Python 提取 PDF 指定内容生成新PDF
  5. 把色*版 “微信” 的底裤都给挖出来了,网友: 草率了。。。
  6. 在VFP中如何调用其它程序
  7. [高精度]高精度的封装
  8. OmniPlayer Pro for Mac v1.4.12 支持无线投屏的视频播放器
  9. Tungsten Fabric(6):部署更高版本的TF
  10. 【STM32L552ZET6QU】小白入门资料汇总