重学Java之基础部分——自动拆箱与装箱的秘密

2020-06-01  本文已影响0人  LovelyLM

本系列是“重学Java”,其中有些过于基础部分可能会一笔带过,本系列主要作用在于提取重要及精华。

首先,Java是一门面向对象的语言,一切皆为对象。不过,凡是都有特例。。。

Java两大数据类型:

1. 内置数据类型(基本数据类型)

2. 引用数据类型(对象)


基本数据类型

Java语言提供了八种基本数据类型,其中包括四种整型(byte、short、int、long),两种浮点型(float、double),布尔类型(boolean)和字符型(char)。详细见下图:

引用数据类型

也就是常说的对象。引用类型通常由变量指向对象的内存地址,并且所有对象默认值都为null。

引用类型在被创建时,首先要给其引用(变量)在栈分配一块内存,而对象的具体信息都存储在堆中,然后将引用指向对象。

自动拆箱与自动装箱

每一种基本类型都对应其引用类型,并且可以相互转换,这些转换的过程,就叫做拆箱与装箱。在jdk5之前,必须自己手动进行操作,比如Integer value = new Integer(10); //或者这样做 Integer value = Integer.valueOf(10);而在jdk5之后,你可以直接这样定义:Integer value = new Integer(10); int i = value;其中转换的过程由编译器帮你完成了,在虚拟机实际执行的代码中,还是有拆箱与装箱这一过程

简易实现

在八种包装类型中,都提供了两种种方法来直接转换:

静态方法valueOf(基本类型):将基本类型直接转换为对应的包装类型(此转换过程中也会涉及数据类型的自动转换)

实例方法xxxValue():将具体的包装类型对象转换成基本类型,此方法可以实现6种任意数字类型的强制转换。

自动装箱与拆箱中的“坑”

自动拆箱与自动装箱存在复用情况,总结如下:

(1)Integer默认复用了[-128,127]这些对象,其中高位置可以修改;

(2)Byte复用了全部256个对象[-128,127];

(3)Short服用了[-128,127]这些对象;

(4)Long服用了[-128,127];

(5)Character复用了[0,127],Charater不能表示负数;

Double和Float是连续不可数的,所以没法复用对象,也就不存在自动装箱复用陷阱。

上一篇 下一篇

猜你喜欢

热点阅读