Java 原始包装器类中的问题
在比较Long、Integer等基本包装类时,为什么不使用==呢Java 原始包装器类中的问题,java,wrapper,primitive,Java,Wrapper,Primitive,在比较Long、Integer等基本包装类时,为什么不使用==呢 public static void main(String[] args) { Number l = Integer.parseInt("30"); Number l2 = Integer.parseInt("30"); System.out.println(l == l2); l = Integer.parseInt("3000");
public static void main(String[] args) {
Number l = Integer.parseInt("30");
Number l2 = Integer.parseInt("30");
System.out.println(l == l2);
l = Integer.parseInt("3000");
l2 = Integer.parseInt("3000");
System.out.println(l == l2);
}
为什么在上面的代码中一个结果为真,另一个结果为假?这些行
Number l = Integer.parseInt("30");
Number l2 = Integer.parseInt("30");
由Java编译器(自动outboxing)转换为
valueOf(int)API表示此方法将始终缓存范围为-128到127(包括128到127)的值。也就是说,对于30个实例,从缓存返回相同的整数实例;对于3000,返回两个不同(新)的整数实例。这些行
Number l = Integer.parseInt("30");
Number l2 = Integer.parseInt("30");
由Java编译器(自动outboxing)转换为
valueOf(int)API表示此方法将始终缓存范围为-128到127(包括128到127)的值。也就是说,对于30个实例,从缓存返回相同的整数实例;对于3000,返回两个不同(新)的整数实例。首先,警告:您没有比较值;您正在比较内存地址。 包装器类仍然是真正的对象-测试对象相等性的唯一方法是使用
equals()
方法。如果与兼容的*原语进行比较,则自动取消装箱会将整数
转换为整数
,并对其进行相等性检查。请注意,Number
不能自动取消装箱;您必须打电话才能获得int
返回
其次,Integer.valueOf()
。在该范围内实例化的任何两个Integer
对象都将解析为相同的内存地址
*:这些
Number
对象中的任何一个都需要先变成int
警告:您没有比较值;您正在比较内存地址。
包装器类仍然是真正的对象-测试对象相等性的唯一方法是使用equals()
方法。如果与兼容的*原语进行比较,则自动取消装箱会将整数
转换为整数
,并对其进行相等性检查。请注意,Number
不能自动取消装箱;您必须打电话才能获得int
返回
其次,Integer.valueOf()
。在该范围内实例化的任何两个Integer
对象都将解析为相同的内存地址
*:这些Number
对象中的任何一个都需要成为int
考虑这种情况:
new Integer(30)==new Integer(30)
在=
的每一侧都有一个新的实例,那么左侧和右侧是不同的对象,比较结果为false(因为它测试实例标识)
装箱的情况更复杂,因为它依赖于Integer.valueOf
,它已经缓存了一些低值整数的值(至少在-128到127范围内,尽管实现可以选择更大的范围)
这个问题类似于下面的问题,其中等式的计算结果为true
,即使我们被告知应该使用equals
来比较字符串
String a = "foo";
String b = "foo";
System.out.println(a==b);
考虑这种情况:
new Integer(30)==new Integer(30)
在=
的每一侧都有一个新的实例,那么左侧和右侧是不同的对象,比较结果为false(因为它测试实例标识)
装箱的情况更复杂,因为它依赖于Integer.valueOf
,它已经缓存了一些低值整数的值(至少在-128到127范围内,尽管实现可以选择更大的范围)
这个问题类似于下面的问题,其中等式的计算结果为true
,即使我们被告知应该使用equals
来比较字符串
String a = "foo";
String b = "foo";
System.out.println(a==b);
根据java规范 如果要装箱的值p为true、false、一个字节或\u0000到\u007f范围内的字符,或一个介于-128和127(包括-128和127)之间的整数或短数字,则让r1和r2为p的任意两个装箱转换的结果。r1==r2总是这样
根据java规范 如果要装箱的值p为true、false、一个字节或\u0000到\u007f范围内的字符,或一个介于-128和127(包括-128和127)之间的整数或短数字,则让r1和r2为p的任意两个装箱转换的结果。r1==r2总是这样
什么是
Number
?我可以编写一个任意的“Number”类,并使==以我想要的任何方式工作,即使这是毫无意义的。@RobertHarvey:。您可以有任何类型的Number
对象,也可以是任何一个数字基本包装器。什么类是Number
?我可以编写一个任意的“Number”类,并使==以我想要的任何方式工作,即使这是毫无意义的。@RobertHarvey:。您可以有任何类型的Number
对象,它可以是任意一个数字基本包装器。