Tag: 等于

是否应该在equals和hashCode中考虑JPA实体的id字段?

我在使用JPA2和EclipseLink编写数据库应用程序的测试时遇到了问题: 我将一些实体添加到数据库中,稍后检索它并希望将它与具有我期望确认添加按预期工作的值的实例进行比较。 首先我写了类似的东西 assertEquals(expResult, dbResult); 哪个失败了,因为我真的不知道id字段的值,它是由数据库生成的,因此dbResult与我用new和手动填充创建的dbResult不同。 我看到两个选择: 要么我从equals和hashCode删除id字段,以便比较仅基于“实际值”。 不过,我不知道这是否会导致数据库或其他地方出现问题。 或者我编写测试以手动显式检查除id之外的每个字段。 我该怎么办?

Java – 是否有像instanceof这样的“子类”?

我重写了equals()方法,我需要知道对象是否是Event的子类的实例(Event是超类)。 我想要像“obj subclassof Event”这样的东西。 怎么做到这一点? 提前致谢!

java中==,equals和hashcode的示例

鉴于这种: String s1= new String(“abc”); String s2= new String(“abc”); String s3 =”abc”; System.out.println(s1==s3); System.out.println(s1==s2); System.out.println(s1.equals(s2)); System.out.println(s1.equals(s3)); System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println(s3.hashCode()); 输出是: false false true true 96354 96354 96354 这里==为每个对象赋予false,但每个String对象的哈希码是相同的。 为什么会这样?

当equals()基于多个独立字段时,hashCode()方法

我有一个类的相等性基于2个字段,如果任何一个相等,那么这种类型的对象被认为是相等的。 我如何为这样的equals()编写一个hashCode()函数,以便当equals返回true时hashCode的一般契约保持不变? public class MyClass { int id; String name; public boolean equals(Object o) { if (!(o instanceof MyClass)) return false; MyClass other = (MyClass) o; if (other.id == this.id || other.name == this.name) return true; return false; } } 我该如何为这个类编写hashCode()函数? 我想避免像这样返回一个常数的简单案例: public int hashCode() { return 1; }

Java:在equals检查中避免NullPointerException的干净方法

我有一个地址对象,我想为其创建一个equals方法。 我可以通过做类似下面的事情(缩短一点)使这变得非常简单: public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Address other = (Address) obj; return this.getStreet().equals(other.getStreet()) && this.getStreetNumber().equals(other.getStreetNumber()) && this.getStreetLetter().equals(other.getStreetLetter()) && this.getTown().equals(other.getTown()); } 问题是,其中一些可能是空的。 换句话说,如果此地址中没有街道字母,我将获得NullPointerException 。 如何在考虑空值的情况下以干净的方式编写此文件?

为具有浮点成员的类实现“容忍”`equals`和`hashCode`

我有一个带float字段的类。 例如: public class MultipleFields { final int count; final float floatValue; public MultipleFields(int count, float floatValue) { this.count = count; this.floatValue = floatValue; } } 我需要能够按值比较实例。 现在我如何正确实现equals & hashCode ? 实现equals和hashCode的常用方法是仅考虑所有字段。 例如,Eclipse将生成以下equals : public boolean equals(Object obj) { // irrelevant type checks removed …. MultipleFields other = (MultipleFields) obj; if (count != other.count) return […]

数组等于忽略顺序

可能重复: Java:检查数组的相等性(顺序无关紧要) 我有两个数组: String[] a1 = {“a”, “b”, “c”}; String[] a2 = {“c”, “b”, “a”}; 我需要检查两者是否包含相同的元素(和相同的长度), 而不管元素的顺序如何 。 我尝试了Arrays.equals(a1, a2)但它考虑了元素的顺序。 org.apache.commons.lang.ArrayUtils不提供这个东西。 我知道我可以通过创建自己的方法(检查相同的长度,然后对两个数组进行排序然后使用Arrays.equals(a1, a2) )来实现相同的目的Arrays.equals(a1, a2)但是想知道这个东西是否在任何API中提供或者还有更多聪明的方式做同样的事情。

为什么Java的Area#equals方法不会覆盖Object#equals?

我刚遇到Java java.awt.geom.Area#equals(Area)方法引起的问题。 问题可以简化为以下unit testing: @org.junit.Test public void testEquals() { java.awt.geom.Area a = new java.awt.geom.Area(); java.awt.geom.Area b = new java.awt.geom.Area(); assertTrue(a.equals(b)); // -> true java.lang.Object o = b; assertTrue(a.equals(o)); // -> false } 经过一些头脑刮擦和调试后,我终于在JDK源代码中看到, Area equals方法的签名如下所示: public boolean equals(Area other) 请注意,它不会从Object @Override正常的equals方法,而只是使用更具体的类型重载方法。 因此,上面示例中的两个调用最终会调用equals不同实现。 由于Java 1.2以来存在此行为,我认为它不被视为错误。 因此,我更感兴趣的是找出为什么决定不正确地覆盖equals方法,但同时提供一个重载变量。 (另一个提示,这是一个真正的决定是没有覆盖hashCode()方法。) 我唯一的猜测是作者担心,在Set , Map等中放置Area s时,缓慢equals区域的实现不适合比较相等。 数据结构。 (在上面的例子中,你可以添加a HashSet ,虽然b等于a ,但调用contains(b)将失败。)然后,为什么他们不仅仅以不冲突的方式命名可疑方法有这样一个基本概念,如equals方法?

equals()和hashCode()之间的区别

我想要一个关于equals(),“==”和hashCode()的简短定义。 如果我运行以下代码意味着输出将是“true false 2420395 2420395”。 但我明白equals()方法比较字符串和“==”比较引用。 但是在输出中,hashCcode()方法将两个字符串的引用号打印为相同,然后“==”返回“false”。 String str = “Name”; String str1 = new String(“Name”); if(str.equals(str1)) System.out.println(“true”); else System.out.println(“false”); if(str==str1) System.out.println(“true”); else System.out.println(“false”); System.out.println(str.hashCode()); System.out.println(str1.hashCode()); }

整数值比较

我是一个新手Java编码器,我只是读取一个整数类的变量,可以在API中描述三种不同的方式。 我有以下代码: if (count.compareTo(0)) { System.out.println(out_table); count++; } 这是在循环内部,只输出out_table 。 我的目标是弄清楚如何查看整数count > 0的值。 我意识到count.compare(0)是正确的方法吗? 还是count.equals(0) ? 我知道count == 0是不正确的。 这是正确的吗? 是否存在值count=0的值比较运算符?