Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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,如果这是一个重复,我会很高兴地删除它,但我找不到它 为什么第二次比较返回false?谢谢 $ cat test.java class test { public static void main(String[] args) { Integer num1 = new Integer(0); Integer num2 = new Integer(0); num1 = 1; num2 = 1; if (num1 =

如果这是一个重复,我会很高兴地删除它,但我找不到它

为什么第二次比较返回false?谢谢

$ cat test.java 

class test {
public static void main(String[] args) {
        Integer num1 = new Integer(0);
        Integer num2 = new Integer(0);
        num1 = 1;
        num2 = 1;

        if (num1 == num2) {
            System.out.println("Numbers are equal");
        }
        num1 = 128;
        num2 = 128;
        if (num1 == num2) {
            System.out.println("Numbers are equal using == ");
                }
        if (num1.equals(num2)) {
            System.out.println("Numbers are equal using .equals");
        }
    }
}
$ javac test.java 
$ java test
Numbers are equal
Numbers are equal using .equals

在Java中,
整数
应该使用
equals()
进行比较,因为它们是对象类型,而不是原语。第一个示例之所以有效,是因为Java创建了一个介于-128和127之间的
整数池(尽管可以配置此范围),并且它们之间的所有身份比较(使用
=
)都有效,因为这些数字是从池中检索的。每次都会创建新的较大数字,标识比较对它们不起作用-这就是为什么为了安全起见,必须使用
equals()
进行对象之间的所有相等比较,这将始终有效。正如您刚才所看到的,使用
=
有时有效,但并不总是有效。

在Java中,应该使用
equals()
比较
整数,因为它们是对象类型,而不是原语。第一个示例之所以有效,是因为Java创建了一个介于-128和127之间的
整数池(尽管可以配置此范围),并且它们之间的所有身份比较(使用
=
)都有效,因为这些数字是从池中检索的。每次都会创建新的较大数字,标识比较对它们不起作用-这就是为什么为了安全起见,必须使用
equals()
进行对象之间的所有相等比较,这将始终有效。正如您刚才所看到的,使用
==
有时会起作用,但并不总是如此。

因为
num1
num2
被声明为
整数
类型,而不是原语
int
类型,分配使用自动装箱。脱糖过程使用该方法将
int
转换为
Integer
。对于128或更多的值,不需要使用此方法来缓存
Integer
对象,因此每次自动装箱值128时都会创建一个新实例


当测试这两个不同对象的引用相等性时,结果为
false
。对于从-128到127的值,结果将为真,因为
valueOf()
方法使用的缓存始终返回相同的实例。

因为
num1
num2
声明为
整数
类型,而不是基元
int
类型,赋值使用自动装箱。脱糖过程使用该方法将
int
转换为
Integer
。对于128或更多的值,不需要使用此方法来缓存
Integer
对象,因此每次自动装箱值128时都会创建一个新实例


当测试这两个不同对象的引用相等性时,结果为
false
。对于从-128到127的值,结果将为真,因为
valueOf()
方法使用的缓存一致地返回相同的实例。

Integers-128到127在内部缓存以使用相同的
Integer
实例。但是,所有其他值在每次声明时都会创建一个新的
Integer
,因此
num1
num2
是两个不同的
Integer
对象。这个问题以前有人问过,但我没有这样一个重复的链接。@Vulcan你是第一个回答这个问题的人。将其作为答案提交,我会将其标记为已回答。谢谢。@koodawg谢谢,但如果我知道以前已经回答过重复的问题,我会尽量避免回答,因为在这种情况下,我的知识往往来源于看到类似问题的答案。在重新发布别人在答案中所写内容的改写版本时获得声誉是不公平的。整数-128到127在内部缓存以使用相同的
Integer
实例。但是,所有其他值在每次声明时都会创建一个新的
Integer
,因此
num1
num2
是两个不同的
Integer
对象。这个问题以前有人问过,但我没有这样一个重复的链接。@Vulcan你是第一个回答这个问题的人。将其作为答案提交,我会将其标记为已回答。谢谢。@koodawg谢谢,但如果我知道以前已经回答过重复的问题,我会尽量避免回答,因为在这种情况下,我的知识往往来源于看到类似问题的答案。在重新发布别人在回答中所写内容的改写版本时获得声誉是不公平的。re“整数应使用等于进行比较”-是的,我知道这一点。那不是我的问题。谢谢。这完全回答了你的问题,不需要摆出态度。@koodawg,答案就在那之后的句子中。现在它回答了我的问题,在添加了关于-128和127之间的缓存的措辞之后。没有态度。谢谢。@SimonT前5分钟内的任何编辑都不会显示在编辑历史记录中,因此答案可能是在注释后编辑的。Re“整数应使用等于进行比较”-是的,我知道。那不是我的问题。谢谢。这完全回答了你的问题,不需要摆出态度。@koodawg,答案就在那之后的句子中。现在它回答了我的问题,在添加了关于-128和127之间的缓存的措辞之后。没有态度。谢谢。@SimonT前5分钟内的任何编辑都不会显示在编辑历史记录中,因此答案可能是在评论之后编辑的。