您的位置 首页 java

面试题系列:Java中为什么设计包装类

Java 的设计中提倡一种思想,即一切皆对象。但是从数据类型的划分中,我们知道 Java 中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型怎么能够称为对象呢?于是Java为基本数据类型分别设计了对应的类,称之为包装类(Wrapper Classes)

基本类型: boolean char , int, byte short ,long, float,double

包装器类型:Boolean,Character, Integer ,Byte,Short,Long,Float,Double

从上表中我们可以看出,除了 Integer 和 Character 定义的名称与基本数据类型定义的名称相差较大外,其它的 6 种类型的名称都是很好掌握的。

1、包装类型的作用

Java是一个面向对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。

另外,当需要往ArrayList, HashMap 中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装Object的,这是就需要这些基本类型的包装器类。

2、装箱和拆箱

存在基本数据类型与其对应的包装类,那么他们之间互相的转换操作就称为装箱与拆箱

  • 装箱:将基本数据类型转换成包装类(每个包装类的 构造方法 都可以接收各自数据类型的变量)
  • 拆箱:从包装类之中取出被包装的基本类型数据(使用包装类的 xxxValue 方法)

可以看见,自动装箱的底层原理是调用了包装类的 valueOf 方法,而自动拆箱的底层调用了包装类的 intValue() 方法。

3、基本类型和包装类型的区别

1)声明方式不同:

基本类型不使用new关键字,而包装类型需要使用new关键字来在堆中分配存储空间;

2)存储方式及位置不同:

基本类型是直接将变量值存储在栈中,而包装类型是将对象放在堆中,然后通过引用来使用;

3)初始值不同:

基本类型的初始值如int为0,boolean为false,而包装类型的初始值为null;

4)使用方式不同:

基本类型直接赋值直接使用就好,而包装类型在集合如Collection、 Map 时会使用到。

4、另类的Integer.valueOf

我们上面已经看过了用于自动拆箱的 intValue 方法的源码,非常简单。接下来咱来看看用于自动装箱的valueOf,其他包装类倒没什么好说的,不过 Integer中这个方法还是有逻辑的:

IntegerCache 又是啥,点进去看看:

IntegerCache 是 Integer 类中的静态内部类,综合这两段代码,我们大概也能知道,IntegerCache 其实就是个缓存,其中定义了一个缓冲区 cache,用于存储 Integer 类型的数据,缓存区间是 [-128, 127]。

回到 valueOf 的源码:它首先会判断 int 类型的实参 i 是否在可缓存区间内,如果在,就直接从缓存 IntegerCache 中获取对应的 Integer 对象;如果不在缓存区间内,则会 new 一个新的 Integer 对象。

文章来源:智云一二三科技

文章标题:面试题系列:Java中为什么设计包装类

文章地址:https://www.zhihuclub.com/197668.shtml

关于作者: 智云科技

热门文章

网站地图