【Java面试题(Java核心知识点)】--002自动装箱和拆箱
002自动装箱和拆箱
- 装箱和拆箱的概念
- valueOf
- ==运算符和equals函数
装箱和拆箱的概念
- 装箱:将基本类型用包装器类型包装起来
- 拆箱:将包装器类型转换为基本类型
valueOf
Integer a = 100;Integer b = 100;Integer c = 128;Integer d = 128;System.out.println(a == b); // trueSystem.out.println(c == d); // false
其实,Integer
方法中的valueOf
方法:
public static Integer valueOf(int i){if(i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
当不满足条件时,会重新创建一个对象返回,故结果必然不相等。
valueOf
方法在创建Integer
对象的时候,如果数值在[-128,127]
之间,便返回指向IntegerCache.cache
中已经存在的对象的引用,否则创建一个新的Integer
对象。Double
类型中的valueOf
方法,每次返回都是重新new
的对象。Integer
、Short
、Byte
、Character
、Long
这几个类的valueOf
方法的实现类似。Double
、Float
的valueOf
方法的实现类似。Boolean
的True
和False
是两个静态成员属性。
Integer i = new Integer(xxx)
会触发自动装箱,而Integer i = xxx
不会。
==运算符和equals函数
==
运算符的两个操作数都是包装器,则比较是否指向同一对象,如果有一个操作数是表达式(包括算数运算)则比较的是数值(会触发自动拆箱)。equals
会先触发自动拆箱,再触发自动装箱过程。int == Integer
进行比较时,Integer
会先拆箱再比较。integer1 == integer2
进行比较时,由于都是通过new
创建,故存放位置不同,因此为false
。
上一篇:001隐式(自动)类型转换和显示(强制)类型转换
❤️这里是 三千步, 让我们一起学习进步~❤️