Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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_Integer_Int - Fatal编程技术网

Java 使用变量声明使用新的与正常的偏差和整数的性质(装箱/取消装箱)

Java 使用变量声明使用新的与正常的偏差和整数的性质(装箱/取消装箱),java,integer,int,Java,Integer,Int,伙计们,谁能给我解释一下new的本质和Integer的用法 Integer i = new Integer(-10); Integer j = new Integer(-10); Integer k = -10; Integer l=-10; System.out.println(i==j); System.out.println(k==l); 答案是假的,是真的 下一个 我得到的答案是错的。 谁能解释这种性质。 提前感谢:)在您的第一个示例中,您总是创建新的Integer对象,并将这些引用分

伙计们,谁能给我解释一下new的本质和Integer的用法

Integer i = new Integer(-10);
Integer j = new Integer(-10);
Integer k = -10;
Integer l=-10;
System.out.println(i==j);
System.out.println(k==l);
答案是假的,是真的

下一个

我得到的答案是错的。 谁能解释这种性质。
提前感谢:)

在您的第一个示例中,您总是创建新的
Integer
对象,并将这些引用分配给
i
j
。对于
k
l
您正在使用自动装箱,它有时创建新对象,有时不创建

在第二个示例中,您只是使用了自动装箱,但是使用了不同的值,这说明了上面的“有时”

发件人:

如果要装箱的值p为true、false、一个字节或\u0000到\u007f范围内的字符,或一个介于-128和127(包括-128和127)之间的整数或短数字,则让r1和r2为p的任意两个装箱转换的结果。r1==r2总是这样

理想情况下,装箱一个给定的原语值p,总是会产生一个相同的引用。在实践中,使用现有的实现技术可能不可行。上述规则是一种务实的妥协。上面的最后一条要求将某些公共值始终装箱到不可区分的对象中。实现可以延迟或急切地缓存这些数据。对于其他值,此公式不允许程序员对装箱值的标识进行任何假设。这将允许(但不要求)共享部分或所有这些引用

这确保了在大多数常见情况下,行为将是所需的,而不会造成不适当的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有char和short值,以及-32K到+32K范围内的int和long值


先生,你所说的有时创造新的物体,有时不创造是什么意思?在第二个例子中,如你所说,范围是-128到127,结果r1==r2是真的,很好。但是a,b的值是128,它们是一样的,但我还是得到了一个假值呢?@GursahibSahni:你读了JLS的那部分了吗?我觉得这很清楚。基本上,“小”整数有一个预定义值的缓存——这些值将用于装箱小整数,但装箱大值每次都会创建一个新对象。先生,那么你是想说,对于大整数,每次创建一个新对象,结果都是一个假值吗?@GursahibSahni:是的,没错。(其中“大型”是特定于实现的。)@GursahibSahni:请再次仔细阅读我的回答。都在里面。
    Integer a=128;
    Integer b=128;
    Integer c=127;
    Integer d=127;
    System.out.println(a==b);
    System.out.println(c==d);