jjzjj

hashCode

全部标签

java - 忽略 equals/hashCode 中的某些字段时的潜在陷阱?

如果对象的某些字段表示实际状态,我想在重写equals和hashCode时可以忽略这些字段...虽然我对此感到不安,但想问一下,这是常见的做法吗?这种方法是否存在任何潜在的缺陷?关于忽略equals/hashCode中的某些字段,是否有任何文档或指南?在我的特定情况下,我正在探索问题的状态空间。我想保留一个已访问状态的哈希集,但我也在考虑包含通向该状态的路径。显然,两个状态是相等的,即使它们是通过不同的路径找到的。 最佳答案 这基于您如何看待给定对象的独特性。如果它有一个主键(唯一键),那么单独使用该属性就足够了。如果您认为唯一性是

java - java.lang.Object的hashCode具体使用的是什么算法

在JVM中使用什么算法来实现java.lang.Object的隐式hashCode()方法?[OpenJDK或OracleJDK在答案中是首选]。 最佳答案 它依赖于实现(而且在很大程度上,算法完全取决于实现,只要它是一致的。)但是,根据答案here,你可以看到nativesourcefile其中哈希是在OpenJDK7中生成的(查看get_next_hash()函数),它实际上指定了此特定版本中的许多可能算法://Possibilities://*MD5Digestof{obj,stwRandom}//*CRC32of{obj,s

Java:比较/排序任意对象

我是否可以为JVM中的所有对象定义一个序列/顺序,以便对于任何两个不同的对象o1或o2,有一个明确定义的规则,即o1>o2或o2>o1和o1==o2当且仅当它们是同一个对象时?identityHashCode()比较将是一个很好的选择,如果有无冲突保证(没有)。出生时间也可以——如果我能以某种方式获得的话。有什么想法吗?谢谢! 最佳答案 如果您能够维护自己的对象存储库,则可以使用WeakHashMap维护您自己的序列号。 关于Java:比较/排序任意对象,我们在StackOverflow

java - Class.getDeclaredFields() 是否以一致的顺序返回成员?

文档将该方法描述为:Theelementsinthearrayreturnedarenotsortedandarenotinanyparticularorder但是我不确定这是否意味着每次应用程序调用例程时顺序都不一致。我正在寻找一种方法来为找到的每个字段配对唯一ID-但它还需要与下次运行应用程序时保持一致,即连续生成相同的ID。我只想遍历找到的每个字段并为每个迭代的元素增加一个计数器。然后将特定元素的ID分配给计数器等于的任何值,这些“id”不一致,但如果字段未以一致的顺序返回。 最佳答案 顺序不需要在运行中保持稳定。然而,该字段

java - 所有实例都相等的类的 HashCode 实现

假设我有一个所有实例都被视为相等的类。一个典型的用例是没有任何状态但仅作为函数运行的类。publicclassToStringFunctionimplementsFunction{@OverridepublicStringapply(Objecto){returno.toString();}@Overridepublicbooleanequals(Objecto){returnoinstanceofToStringFunction;}}现在,应该如何实现hashCode方法?自然地,它需要是一个常量值才能遵守equals/hashCode契约。但是那应该是什么值呢?如果使用了一些微不足

java - 为什么Collection接口(interface)有equals()和hashCode()?

为什么Collection接口(interface)有equals(Objecto)和hashCode(),假设任何实现都默认有那些(继承自Object)? 最佳答案 来自CollectionJavaDoc:WhiletheCollectioninterfaceaddsnostipulationstothegeneralcontractfortheObject.equals,programmerswhoimplementtheCollectioninterface"directly"(inotherwords,createaclas

java - 针对特定情况覆盖 Java 中的 hashCode

我知道在使用hashCode和equals时还有其他关于一般最佳实践的问题,但我有一个非常具体的问题。我有一个类,它的实例变量是同一类的数组。更明确地说,这是代码:ClassNode{Nodearr[]=newNode[5];}我需要为Node类重写hashCode,数组是判断两个Node是否相同的重要决定因素。如何有效地将数组合并到hashCode的计算中?--编辑--我正在尝试检查这两个节点是否相同,这意味着它们具有相同数量的子节点,并且这些子节点导致完全相同的状态。因此,我实际上是在尝试比较两个节点的子树。我想知道我是否可以使用哈希来进行这种相等性检查。我想我实际上需要散列整个子

java - 将哈希函数委托(delegate)给 hibernate 中未初始化的委托(delegate)会导致更改哈希代码

我对使用hibernate委托(delegate)给未初始化对象的hashCode()有问题。我的数据模型如下所示(以下代码经过高度修剪以强调问题并因此损坏,请勿复制!):classCompound{@FetchType.EAGERSetparts=newHashSet();StringsomeUniqueName;publicinthashCode(){finalintprime=31;intresult=1;result=prime*result+((getSomeUniqueName()==null)?0:getSomeUniqueName().hashCode());retur

java - 为什么在 Enum hashCode() 中引用 Object hashCode() 实现,而不是 ordinal() 函数?

这个问题在这里已经有了答案:WhatisthereasonbehindEnum.hashCode()?(7个答案)关闭9年前。我一直认为enumhashCode指的是Java中的ordinal,因为ordinal似乎是hashCode的完美候选者,但事实证明enumhashCode实际上是指默认的hashCode对象实现。我明白,这与JLS并不矛盾,但这仍然让我感到惊讶,我想不出为什么要这样做。虽然我猜想JVM可能会以某种方式依赖它来提供独特的保证,但这对64位JVM来说不再适用。我已经检查了JDK1.6和最新的JDK7,两者的方式相同。有谁知道为什么会这样吗?使用ordinal作为h

java - String.hashCode() 效率低下吗?

关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭9年前。Improvethisquestion查看sourcecodeofjava.lang.Stringofopenjdk-1.6时,我看到String.hashCode()使用31作为质数并计算s[0]*31^(n-1)+s[1]*31^(n-2)+...+s[n-1]现在我看这个的原因是我想到的问题是比较String.equals中的hashCodes是否会使String.equals明显更快。但是现在看hashCode,我想到