Tag: 相等

Java hashCode()方法是对象相等的可靠度量吗?

我目前正在比较两个相同类型的复杂对象,其中多个字段由自定义对象类型的数据结构组成。 假设没有任何自定义对象覆盖hashCode()方法,如果我比较对象中每个字段的哈希码,并且它们将变成相同,我是否对所比较的内容有100%的信心对象是一样的吗? 如果没有,假设我不能使用任何外部库,那么您建议使用哪种方法来比较两个对象。

Scala,Java和平等

val filesHere = (new java.io.File(“.”)).listFiles val filesHere2 = (new java.io.File(“.”)).listFiles scala> filesHere == filesHere2 res0:Boolean = false 这非常直观。 我宁愿期望filesHere和filesHere2相等。 这肯定是由于Java和Scala之间的语义不匹配,例如,关于数组或(文件)相等。 显然,我在这里遗漏了一些东西!

在Collection中查找重复条目

是否有工具或库可根据可实施的特定标准在集合中查找重复条目? 为了使自己清楚:我想根据具体标准比较条目。 所以我认为Predicate返回true或false是不够的。 我不能使用equals 。

在Java中编译时是否完成了字符串实习?

我真的很困惑字符串实习在Java中是如何工作的。 我写的时候: String a = “ABC”; String b = “ABC”; if (a==b) System.out.println(“Equal”); 编译时编译器是否将字符串文字“ABC”存储到字符串常量池中? 这听起来不合逻辑,因为我认为字符串常量池是由JVM在运行时创建的,我不知道如果在编译时完成它是如何可能的,因为Java编译器甚至不调用JVM。 如果它没有在编译时完成并且它在运行时完成,那么为什么以下返回false(取自此答案 )? // But .substring() is invoked at runtime, generating distinct objects “test” == “!test”.substring(1) // –> false 如果它是在运行时完成的,为什么JVM不能确定它们是相同的字符串? 我真的很困惑字符串实习如何在Java中工作以及Java字符串池的存储位置。

等于运算符如何处理原始和对象类型数据

我知道这是一个非常基本的问题,但我想明确这个概念。 我想知道在原始和对象类型的情况下==运算符如何工作。 例如 Integer a = 1; int b = 1; System.out.println(a == b) 如何将a与b进行比较,而a包含包含值1的对象的引用。有人可以向我清楚它是如何在内部工作的吗?

hibernate / webapp上下文中的对象相等

你如何处理由hibernate管理的java对象的对象相等性? 在“hibernate in action”一书中,他们说人们应该支持商业密钥而不是代理密钥。 大多数时候,我没有业务密钥。 想一想映射到一个人的地址。 地址保存在Set中并显示在Wicket RefreshingView中(使用ReuseIfEquals策略)。 我可以使用代理id或使用equals()和hashCode()函数中的所有字段。 问题是那些字段在生命周期内对象变化。 要么是因为用户输入了一些数据,要么由于在OSIV(在视图中打开会话)filter内调用JPA merge()而导致id发生变化。 我对equals()和hashCode()契约的理解是那些在对象的生命周期内不应该改变的。 到目前为止我尝试了什么: equals()基于使用数据库id的hashCode()(如果id为null,则为super.hashCode())。 问题:新地址以null id开头,但在附加到某人时获得id,并且此人在osiv-filter中合并()(重新附加)。 首次调用hashCode()时,延迟计算哈希码,并使哈希码成为@Transitional。 不起作用,因为merge()返回一个新对象,并且不会复制哈希码。 我需要的是在我认为在对象创建期间分配的ID。 这里有什么选择? 我不想引入一些额外的持久属性。 有没有办法明确告诉JPA为对象分配ID? 问候