Java包装类及128陷阱

阅读 51

2022-03-22

面试题:

public static void main(String[] args) {
        Integer num1 = 100;
        Integer num2 = 100;
        System.out.println(num1 == num2);
        
        Integer num3 = 128;
        Integer num4 = 128;
        System.out.println(num3 == num4);
}


解析:

答案就在Integet的valueOf()方当中,如果我们的数值在-128-127之间的数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等。

一、为什么要有包装类
1.在面向对象中,“一切皆对象”,但基本数据类型的数据不太符合这一理念,基本数据类型不是对象
2.涉及到类型之间的转化,数据类型之间的基本操作;如果都有我们自己去实现,那么工作量过大。

所以java针对每一个基本数据类型都设计了一个包装类


二、自动拆装箱
1.装箱:把基本类型数据转成对应的包装类对象。

方式一:Integer i = Integer.value(13);

方式二:Integer i = new Integer(13);

2.拆箱:把包装类对象转成对应的基本数据类型数据。

int value = i.intValue();

自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)
在Java 5之前的版本中,基本数据类型和包装类之间的转换是需要手动进行的,但Sun公司从Java5开始提供了的自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)操作 ;
自动装箱:可以把一个基本类型变量直接赋给对应的包装类型变量。
比如:Integer i = 13;
自动拆箱:允许把包装类对象直接赋给对应的基本数据类型变量。
比如:Integer i = new Integer(13); Int j = i;
 

精彩评论(0)

0 0 举报