Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 原始包装器类中的问题_Java_Wrapper_Primitive - Fatal编程技术网

Java 原始包装器类中的问题

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");

在比较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");
        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
对象,它可以是任意一个数字基本包装器。