🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法
💫个人格言:"没有罗马,那就自己创造罗马~"
文章目录
包装类
- 在Java中基本数据类型不是继承来自Object,为了在泛型代码中使用基本数据类型,Java给每个基本数据类型都对应到了一个包装类中。
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
装箱和拆箱
|----------------------|
| 装箱/装包 : 把基本类型转变成包装类型 |
|------------------------|
| 拆箱/拆包:把一个包装类型转变成基本数据类型 |
java
public class Test {
public static void main(String[] args) {
int a = 10;
Integer ii = a ; //自动装箱
Integer ii2 = new Integer(10);
int b = ii2;//自动拆箱
System.out.println(ii);
System.out.println(b);
}
}
通过访问上面代码的字节码文件,我们可以看到装箱的底层逻辑就是通过Integer这个类去调用valueOf
这个方法去装箱。
java
public class Test {
public static void main(String[] args) {
int a = 10;
// Integer ii = a ; //自动装箱
//根据字节码文件的内容可以将自动装箱的代码写成如下样式:
Integer ii = Integer.valueOf(a);//手动装箱
//================================================================================
Integer ii2 = new Integer(10);
// int b = ii2;//自动拆箱
int b = ii2.intValue();//手动拆箱
double d = ii2.doubleValue();//即使原来不是小数类型也能手动拆箱成小数类型
System.out.println(ii);
System.out.println(b);
System.out.println(d);
}
}
阿里巴巴面试题
- ①
java
public static void main(String[] args) {
Integer ii= 100;
Integer ii2 =100;
System.out.println(ii == ii2);
}
- ②
java
public static void main(String[] args) {
Integer ii= 200;
Integer ii2 =200;
System.out.println(ii == ii2);
}
-
为什么上面的结果一个是true,一个是false,这是为什么呢?
- 从上面代码中我们可以看到整个过程中都使用到了装箱,通过查看装箱的源代码
valueOf
:
- 从上面代码中我们可以看到整个过程中都使用到了装箱,通过查看装箱的源代码
java
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
根据原代码我们可知道:cache是缓存数组,如果我们的i是在这个范围内的,他就会返回这个缓存数组,如果不在他就会再重新创建一个对象。如下图所示:
对于100,他是在我们数组的范围内,所以它无需创建对象,只需要在缓存数组中查找即可,这两个装箱的变量他们指向的都是同一个对象的地址所以返回true,而200则需要创建新的对象,这两个变量所指的不是同一个对象,内存地址也不一样,所以返回false。