Java中包装类型使用‘==’比较的坑

发布时间:2024年01月04日

1、缓冲机制

在Java中,Integer 、Byte 、Short 、Long 、Character 五大包装类都有缓冲机制,
且缓冲的默认值范围都是 -128 ~ 127

而Float 、Double 、Boolean 三大包装类并没有缓冲机制。

2、创建包装类对象

两种方法:
(1)构造器方法(就是new出来):不论值的大小,返回的将都会是一个新对象;

(2)自动装箱(就是编译器自动调用包装类的valueOf方法):首先会判断数值是否在-128 ~ 127的范围内,
?? ?如果满足条件,则会从缓存(常量池)中寻找指定数值,若找到缓存,则不会新建对象,
?? ?只是指向指定数值对应的包装类对象,否则,新建对象。

3、自动装箱创建对象时,使用“==”进行比较

在Java中,"=="用于比较两个基本数据类型或两个引用数据类型是否指向同一对象。

对于有缓冲机制的五大包装类,使用自动装箱创建对象时,由于它们的值在-128 ~ 127之间时会被缓存,因此这些值相同的包装类型对象会指向同一个对象,使用"=="比较会返回“true”。

但是,超出这个范围的值创建的包装类对象不是同一个对象,即使值相同,使用"=="也会返回“false”。

// 自动装箱创建对象,值在 -128 到 127 之外
Integer a = 128;
Integer b = 128;
System.out.println(a == b); 
// 输出 false

// 自动装箱创建对象,值在 -128 到 127之间
Integer a = 126;
Integer b = 126;
System.out.println(a == b); 
// 输出 true

4、构造器方法创建对象时,使用“==”进行比较

使用构造器方法创建对象时,不论值的大小,返回的将都会是一个新对象;


// 构造器方法创建对象
Integer a = new Integer(126);
Integer b = new Integer(126);
System.out.println(a == b); 
// 输出 false

5、包装类型 与 基本类型 使用“==”进行比较

在java中,当使用包装类型 与 基本类型 进行“==”进行比较时,包装类型会进行自动拆箱操作。
也就是说,两者是进行数值的对比,那么无论数值多少,只要值相等就会返回 true。

// 构造器方法创建对象
Integer a = new Integer(126);
int b = 126;
System.out.println(a == b); 
// 输出 true

6、包装类型使用“equals()”进行比较

"equals()" 方法会比较两个对象的数值是否相等,而不是比较是否指向同一个对象。 因此,无论包装类型对象的值相等,使用"equals()"方法比较都会返回 true。
文章来源:https://blog.csdn.net/m0_58660225/article/details/135390149
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。