在Java中,Integer 、Byte 、Short 、Long 、Character 五大包装类都有缓冲机制,
且缓冲的默认值范围都是 -128 ~ 127
而Float 、Double 、Boolean 三大包装类并没有缓冲机制。
两种方法:
(1)构造器方法(就是new出来):不论值的大小,返回的将都会是一个新对象;
(2)自动装箱(就是编译器自动调用包装类的valueOf方法):首先会判断数值是否在-128 ~ 127的范围内,
?? ?如果满足条件,则会从缓存(常量池)中寻找指定数值,若找到缓存,则不会新建对象,
?? ?只是指向指定数值对应的包装类对象,否则,新建对象。
在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
使用构造器方法创建对象时,不论值的大小,返回的将都会是一个新对象;
// 构造器方法创建对象
Integer a = new Integer(126);
Integer b = new Integer(126);
System.out.println(a == b);
// 输出 false
在java中,当使用包装类型 与 基本类型 进行“==”进行比较时,包装类型会进行自动拆箱操作。
也就是说,两者是进行数值的对比,那么无论数值多少,只要值相等就会返回 true。
// 构造器方法创建对象
Integer a = new Integer(126);
int b = 126;
System.out.println(a == b);
// 输出 true
"equals()" 方法会比较两个对象的数值是否相等,而不是比较是否指向同一个对象。 因此,无论包装类型对象的值相等,使用"equals()"方法比较都会返回 true。