奇数java整数比较
如果这是一个重复,我会很高兴地删除它,但我找不到它 为什么第二次比较返回false?谢谢奇数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 =
$ 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分钟内的任何编辑都不会显示在编辑历史记录中,因此答案可能是在评论之后编辑的。