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