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

简单Java表达式返回一些意外的结果

简单Java表达式返回一些意外的结果,java,Java,下面的Java代码中使用的表达式是不正确的,几乎不可接受,尽管我只是出于一般目的对它们进行了测试,并获得了一些意想不到的结果。下面是简单的代码片段 package wrapper; final public class Main { public static void main(String[] args) { Integer j1 = 127; Integer j2 = 127; System.out.println(j1

下面的Java代码中使用的表达式是不正确的,几乎不可接受,尽管我只是出于一般目的对它们进行了测试,并获得了一些意想不到的结果。下面是简单的代码片段

package wrapper;

final public class Main 
{
    public static void main(String[] args) 
    {
        Integer j1 = 127;
        Integer j2 = 127;
        System.out.println(j1==j2); //returns true!!!

        Integer k1 = 128;
        Integer k2 = 128;
        System.out.println(k1==k2); //returns false!!!

        Integer w1 = -128;
        Integer w2 = -128;
        System.out.println(w1==w2); //returns true!!!

        Integer m1 = -129;
        Integer m2 = -129;
        System.out.println(m1==m2); //returns false!!!
    }
}

上面的代码显然显示true,因此,这是毫无疑问的


上面的代码预计会在控制台上显示true,但令人惊讶的是,它会显示false。为什么?


此代码显示true,毫无疑问



上述代码再次显示false,但预期返回true。为什么?

==运算符检查引用相等性,但在上述代码中不能保证为真


要比较这些值是否相等,请使用m1.equals(m2)

Integer
s来缓存-128..127范围内的值,因此
j1
j2
来自:

Integer j1 = 127;
Integer j2 = 127;
指向同一个对象


当然,这是JVM实现的事情,所以您永远不应该假设它们是缓存的。对于比较引用类型,请不要使用
=
,而是使用它们的
equals(…)
方法。

发生这种情况的原因是java的整数缓存,并且您使用的是==运算符而不是equals()

使用==意味着比较对象的引用

整数A=135; 整数B=135

A==B将评估它们的引用是否相同(它们是否是相同的对象),而不是它们是否相等

此外,如果A和B在(-128127)之间,则它们被缓存-这意味着如果A和B为35,则它们实际上是相同的(缓存)对象,这就是为什么如果Y在上述范围内,则得到A==B


在这种情况下使用equals。

请注意

int k1 = 128;
int k2 = 128;
System.out.println(k1==k2);

第一个是创建简单的数字类型。第二个方面是创建对象类型,该对象类型包装数值类型,以允许将它们传递给期望对象的函数

在第一种情况下,简单的数值类型只有一个值,并且在使用==时进行比较。但是,创建的对象不使用==来比较它们的值。相反,它们使用==表示它们是否是相同的对象,使用
.equals()
方法表示它们是否具有相同的值。Java中没有运算符重载,因此每当将对象与==进行比较时,它总是问“这是同一个对象吗?”而不是“这两个对象是否具有相同的值?”

因此,在本例中,您给出的代码最终与

Integer k1 = new Integer(128);
Integer k2 = new Integer(128);
System.out.println(k1==k2);
这将返回false,因为k1和k2不是同一个对象。如果您这样做:

Integer k1 = 128;
Integer k2 = k1;
System.out.println(k1==k2);
你会实现的


令人惊讶的是,你上面测试的任何结果都是真实的。这是因为Java保留了一组小数字的整数(-128到127,即一个字节大小),并在可能的情况下将其用于赋值。

因为将对象与比较非原语类型对象引用的
=
运算符进行比较是不正确的。基本类型可以通过
=
运算符进行比较。必须使用
equals
方法比较引用类型(整数、浮点、双精度和其他对象)

有时
==
可能适用于Integer等类型的原因是内部缓存。当您这样声明整数时:

Integer i = 10;
相当于:

Integer i = Integer.valueOf(10);
对于-128到127之间的值,该值是从缓存中获取的,这意味着后续调用将返回相同的对象

但如果你尝试这样做:

Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1 == i2); // prints false
您将有两个不同的对象,它们的引用不相等。要获得正确的结果,您应按如下方式进行比较:

Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1.equals(i2)); // prints true

您应该阅读
equals
hashCode
方法以及它们之间的契约

FWIW,同样的事情在Python中也会发生(
is
操作符大致相当于Java的
=
):对对象使用.equals而不是==在运行时,-128->127存储在JVM中以引用,而不是创建新对象。我能想到的唯一一件事是做一个对象比较,而不是调用compareTo。尝试用int替换Integer,可能会得到不同的结果。注意的可能重复的可能重复,
Integer
的另一个用途是对象可以是
null
,而
int
不能。
Integer k1 = 128;
Integer k2 = k1;
System.out.println(k1==k2);
Integer i = 10;
Integer i = Integer.valueOf(10);
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1 == i2); // prints false
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.out.println(i1.equals(i2)); // prints true