Tag: hashcode

在equals和hashcode方法中使用自动生成的hibenate实体对象的id

可爱的等号和哈希码,所有的理论都在这里 ,也在这里 我已经决定在我的许多hibernate实体/域对象中使用equals()和hashcode()中的自动生成的id。 但是,许多网站都说你不应该这样做,因为在比较或使用哈希码的过程中,第一次将对象持久存在数据库的风险。 我的观点是,在大多数用例中,这比任何其他字段更改都要小得多。 各个域对象在首次创建时会生成一次id,而几乎所有其他字段都有机会在正常业务流程中进行更改(即使可以更改唯一的用户名……)。 在我的许多域对象中,唯一的id几乎是唯一合适的字段(Person,Address,Pet,… Customer等等??组合字段是一个好主意,但从不使用自动生成的id,我想,不是好建议。 我错过了别的什么吗?

int的哈希码

什么是基本类型的哈希码,例如int? 例如,让我们说num是一个整数。 int hasCode = 0; if (num != 0) { hasCode = hasCode + num.hashCode(); }

为case类的equals / hashCode方法生成了什么代码?

我有一些Java代码,我正在翻译成Scala。 代码由一些不可变的类组成,这些类符合Scala中的case class的目的。 但我不想引入错误,因此我想确保为equals和hashCode生成的代码/行为与当前实现等效。 我已经查看了“Scala编程”,但它只是说 第三,编译器将方法的“自然”实现添加到String,hashCode,并且等于你的类。

两个具有相同哈希码的不等对象

Hashcode()和equals()的概念是 1)如果两个对象根据equal()相等,则在这两个对象中的每一个上调用hashcode方法应该产生相同的哈希码。 而另一个是 2)如果两个对象根据equal()不相等,则不需要在两个对象中的每一个上调用hashcode方法必须产生不同的值。 我尝试并理解了第一个,这是第一点的代码。 public class Test { public static void main(String[] args) { Map map = new HashMap(); map.put(1, 11); map.put(4, 11); System.out.println(map.hashCode()); Map map1 = new HashMap(); map1.put(1, 11); map1.put(4, 11); System.out.println(map1.hashCode()); if (map.equals(map1)) { System.out.println(“equal “); } } } 上面的程序为两个不同的对象提供相同的哈希码。 有人可以用一个例子来解释我,根据equals()不同的两个不同对象如何具有相同的哈希码。

这些实体的equals和hashCode(Spring MVC + Hibernate)

有人可以建议我如何做这些实体的equals和hashCode方法? 这是Gara(竞赛)和Agenzia(代理商)之间的多对多关系:一个竞赛有很多代理商,一个代理商可以参加更多竞赛。 我尝试了一些实现但是我得到Stackoverflow错误,或者,当我更新Gara(竞赛)时,我无法更新Agenzie(代理商)的集合,因为我收到此错误: org.springframework.dao.DuplicateKeyException:具有相同标识符值的另一个对象已与会话关联:[com.myApp.model.GaraAgenzia#com.mmyApp.model.GaraAgenziaId@49f]; 嵌套exception是org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联:[com.myApp.model.GaraAgenzia#com.myApp.model.GaraAgenziaId@49f] 当我尝试做更新。 谢谢 Gare.java: @Entity @Table(name = “gare”) public class Gara extends BaseEntity implements Serializable { private static final long serialVersionUID = 6395640401966812691L; /* * inizializzo logger */ static Logger logger = LoggerFactory.getLogger(Gara.class); /* * molti a molti gara-agenzia * * EAGER altrimenti da errore: could not initialize proxy – no […]

为什么在Object中定义了equals和hashCode?

决定在java.lang.Object中包含这些方法的原因是什么? 对于许多类来说,平等和散列是没有意义的。 制作两个接口更合乎逻辑: interface Equalable { boolean equals(Equalable other); } interface Hashable extends Equalable { int hashCode(); } 例如,HashSet定义可能看起来像 class HashSet … 它可以防止一个常见的初学者错误 – 使用一组项而不实现equals / hashCode。

为什么HashMap会重新生成密钥对象提供的哈希码?

我正在阅读Java 1.6 API提供的HashMap类的代码,无法完全理解以下操作的需要(在put和get方法的主体中找到): int hash = hash(key.hashCode()); 方法hash()具有以下主体: private static int hash(int h) { h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); } 这有效地通过对提供的哈希码执行位操作来重新计算哈希值。 即使API声明如下,我也无法理解这样做的必要性: 这很关键,因为HashMap使用两个幂的长度哈希表,否则会遇到低位不同的hashCodes的冲突。 我确实理解键值是存储在数据结构数组中的,并且该数组中项的索引位置由其哈希确定。 我无法理解的是这个函数如何为哈希分布添加任何值。

为什么默认的Object.toString()返回hashCode的hex表示?

我很好奇为什么Object.toString()返回这个: return getClass().getName() + “@” + Integer.toHexString(hashCode()); 与此相反: return getClass().getName() + “@” + hashCode(); 将哈希码显示为hex而不是十进制有什么好处?

==运算符和equals()之间有什么区别? (用hashcode()???)

我正在更深入地学习哈希码,并认为: 1.如果重写equals(),则必须覆盖hashcode()。 2.要查找2个对象是否是同一个对象,请使用==运算符 考虑到这两个因素,在Java中我假设当使用== operator来比较2个实例是否相同时, if(object1 == object2) 实际上是在做 if(object1.hashcode() == object2.hashcode()) 但是通过下面的测试看起来我错了。 public class Main { public static void main(String[] args){ Obj1 one = new Obj1(); Obj1 two = new Obj1(); //is this calling hashCode() in backend??? if(one == two) { System.out.println(“same”); } else { System.out.println(“nope”); } //this is of course return true if(one […]

集合的hashCode方法的最佳实现

我们如何决定集合的hashCode()方法的最佳实现(假设equals方法已被正确覆盖)?