Java 为什么这个条件永远不能满足?

Java 为什么这个条件永远不能满足?,java,Java,我不知道为什么这个条件永远不能满足: 我在比较两个ArrayList值,结果总是错误的 if ( (Integer) results.get(rank) == (Integer) experts.get(j)) 我正在调试,我有两个完全相同的值:3043和3043 但是它不起作用 谢谢==将只对原语进行值比较 无论何时处理对象类型,包括大帽整数、长型等。您需要等于,而不是====将只对原语进行值比较 无论何时处理对象类型,包括大容量整数、长型等,都需要使用equals,not=使用equals

我不知道为什么这个条件永远不能满足: 我在比较两个ArrayList值,结果总是错误的

if ( (Integer) results.get(rank) == (Integer) experts.get(j))
我正在调试,我有两个完全相同的值:3043和3043 但是它不起作用


谢谢

==将只对原语进行值比较


无论何时处理对象类型,包括大帽整数、长型等。您需要等于,而不是==

==将只对原语进行值比较


无论何时处理对象类型,包括大容量整数、长型等,都需要使用equals,not=

使用equals,not==。这是两个表示相同值的不同对象。所以它们不是==不同的对象,而是相等的内容。

使用相等,而不是==。这是两个表示相同值的不同对象。所以它们不是==不同的对象,而是等于相同的内容。

正如Uri所说的,您需要使用该方法。对于这一点,使用equals而不是==

==运算符将只检查 results.getrank和experts.getj指向同一个对象,在本例中,它们在技术上不会指向同一个对象

有两种方法可以实现这一点。 1如果您知道专家将始终包含参考资料,请执行以下操作: experts.getj.equalsresults.getrank

2如果您完全确定您将始终在两面都有参考,请执行以下操作: Integerresults.getrank.intValue==Integerexperts.getj.intValue


享受

就像Uri说的那样,你需要使用这个方法。等于而不是==

==运算符将只检查 results.getrank和experts.getj指向同一个对象,在本例中,它们在技术上不会指向同一个对象

有两种方法可以实现这一点。 1如果您知道专家将始终包含参考资料,请执行以下操作: experts.getj.equalsresults.getrank

2如果您完全确定您将始终在两面都有参考,请执行以下操作: Integerresults.getrank.intValue==Integerexperts.getj.intValue


享受

java对象必须始终使用equals方法进行比较,使用==比较基本值或实际对象引用,这在本例中明显不同;因此您的等式永远不会满足。

必须始终使用equals方法比较java对象,使用==比较基本值或实际对象引用,这在本例中显然是不同的;因此,等式永远不会满足。

==运算符检查两个对象引用是否相同,而不是我们通常认为的相等。这意味着对于整数类型,它会检查它们是否引用相同的整数。如果在代码的某个地方有两行代码创建了值为3043的新整数,而不是重用一个实例,那么它们不是指内存中的同一位置。对于您的问题,可能是因为这两个集合中有不同的对象引用

另一种选择是,由于Integer是一种不可变类型,因此您不需要新建任何内容,而可以使用valueOf,并且知道Integer的某些实现包含Integer.valueOf调用返回的前128或256个整数值的缓存

来自OpenJDK:

底线是:除非您明确地获取一个整数并自己将其放入两个集合中,否则不要假设它们是同一个对象。即使您知道它们可能是同一个对象,因为您知道一个JVM的整数缓存实现最高可达4096,也不要依赖于此。并始终使用equals检查对象的相等性,除非您真正想询问它们是否引用了内存中完全相同的位置。对于Integer和String等不可变对象,几乎不需要这样做。

运算符检查两个对象引用是否相同,而不是我们通常认为的相等。这意味着对于整数类型,它会检查它们是否引用相同的整数。如果在代码的某个地方有两行代码创建了值为3043的新整数,而不是重用一个实例,那么它们不是指内存中的同一位置。对于您的问题,可能是因为这两个集合中有不同的对象引用

另一种选择是,由于Integer是一种不可变类型,因此您不需要新建任何内容,而可以使用valueOf,并且知道Integer的某些实现包含Integer.valueOf调用返回的前128或256个整数值的缓存

来自OpenJDK:

底线是:除非您明确地获取一个整数并自己将其放入两个集合中,否则不要假设它们是同一个对象。即使您知道它们可能是同一个对象,因为您知道一个JVM的整数缓存实现最高可达4096,也不要依赖于此。并始终检查obj
ect使用equals表示相等,除非你真的想问它们在内存中是否引用了完全相同的位置。对于不可变对象(如Integer和String),几乎不需要这样做。

作为替代方案,如果在应用程序上下文中合适,可以将其转换为int而不是Integer。

作为替代方案,如果在应用程序上下文中合适,可以将其转换为int而不是Integer。

因为==运算符检查同一引用意义上的对象标识,所以不会根据它们包含的值进行比较,而是根据分配给它们的引用进行比较

在原语中使用==是安全的,因为它们没有引用,所以在相同值的意义上检查它们是否相等,但在处理对象时,不幸的是Integer是一个封装int的对象,它会检查它们是否确实是相同的对象,而不是它们是否具有相同的值

例如:

Integer x = new Integer(4);
Integer y = x;

//this will be true: same reference
assert(x == y)
如果您想保留==运算符,您应该这样做

if (results.get(rank).intValue() == experts.get(j).intValue())
否则切换到等于运算符:

// you don't need to cast them since equals will take care of checking 
//if they are of the same type
if (results.get(rank).equals(experts.get(j)))
因为==运算符检查同一引用意义上的对象标识,所以不会根据它们包含的值进行比较,而是根据分配给它们的引用进行比较

在原语中使用==是安全的,因为它们没有引用,所以在相同值的意义上检查它们是否相等,但在处理对象时,不幸的是Integer是一个封装int的对象,它会检查它们是否确实是相同的对象,而不是它们是否具有相同的值

例如:

Integer x = new Integer(4);
Integer y = x;

//this will be true: same reference
assert(x == y)
如果您想保留==运算符,您应该这样做

if (results.get(rank).intValue() == experts.get(j).intValue())
否则切换到等于运算符:

// you don't need to cast them since equals will take care of checking 
//if they are of the same type
if (results.get(rank).equals(experts.get(j)))

除非要检查它们是否为相同对象,否则不应将两个引用与“==”进行比较,如果要检查它们是否相等,请使用Object.equals方法,如果要检查它们是否相等,请使用Object.equals方法

如果处理int s,它会工作…如果处理int s,它会工作…new永远不会缓存:它必须返回一个新对象。缓存将违背整个java语言基础。可缓存的是,例如,valueOf,按类整数。语言本身不允许从new中进行这样的缓存。谢谢@polygeneloulodes,这正是我所想的!new永远不会被缓存:它必须返回一个新对象。缓存将违背整个java语言基础。可缓存的是,例如,valueOf,按类整数。语言本身不允许从new中进行这样的缓存。谢谢@polygeneloulodes,这正是我所想的!