Tag: hashcode

为什么更改用作HashMap中的键的对象的哈希码会使查找返回null?

请考虑以下情形: Object o1 = new Object(); Object o2 = new Object(); HashMap map = new HashMap(); map.put(o1, o2); boolean test1 = map.get(o1) == o2; // This evaluates to true // Now lets say we alter the state of o1: o1.setSomeInternalState(Object newState); boolean test2 = map.get(o1) == o2; // This evaluates to false, because now map.get(o1) […]

将对象的哈希码定义为所有类变量哈希码的总和,乘法等是不正确的?

假设我有以下课程: class ABC { private int myInt = 1; private double myDouble = 2; private String myString = “123”; private SomeRandomClass1 myRandomClass1 = new … private SomeRandomClass2 myRandomClass2 = new … //pseudo code public int myHashCode() { return 37 * myInt.hashcode() * myDouble.hashCode() * … * myRandomClass.hashcode() } } 这是hashCode的正确实现吗? 这不是我通常这样做的方式(我倾向于遵循Effective Java的指导方针),但我总是试图像上面的代码那样做。 谢谢

什么是Java 8中String键的替代散列?

Java 8为String键提供了替代散列,以在遇到大量密钥哈希码冲突时提高性能。 任何人都可以解释它是什么以及它将如何工作?

如何自定义Eclipse生成的hashCode()和equals()?

建议(有时是必要的)表示值( 值类 )的类来覆盖hashCode() , equals() [和可选的toString() ]方法。 这些方法返回的值取决于类及其超类的所有成员变量或子集。 要正确实现它们,你必须要了解一些关于散列和一点代数和集合理论的理论(不要太多,几乎所有的东西都在这些方法的javadocs和有效的JavaformsJosh Bloch中解释。) 在大多数情况下,此方法的实现遵循模板,IDE(如Eclipse JDT)包含生成它们的工具。 但是,工具生成器无法做出任何假设,只使用语言和标准库中提供的构造生成这些方法。 因此,这些方法通常看起来非常难看。 实现这些方法的另一种方法是使用像Apache(commons-lang) HashCodeBuilder , EqualsBuilder和ToStringBuilder 。 使用这些实用程序,可以实现自己看起来更好的hashCode()和equals()方法。 我的问题是将这两种方法结合起来。 我希望能够自定义Eclipse的hashCode()和equals()生成器,以便使用HashCodeBuilder和朋友生成它们。 如果不调整JDT,是否可以(以及如何)这样做? 只编写将覆盖默认实现的小插件(但不更改JDT代码)。 谢谢。

ConcurrentHashMap构造函数参数?

我想知道构造ConcurrentHashMap的参数: initialCapacity默认为16(理解)。 loadFactor默认为0.75。 concurrencyLevel默认为16。 我的问题是: 应该使用什么标准来调整loadFactor上升或下降? 我们如何建立并发更新线程的数量? 应该使用什么标准来调整concurrencyLevel向上或向下? 另外: 良好的哈希码实现的标志是什么? (如果SO问题解决了这个问题,请链接到它。) 谢谢!

如果两个不同的对象具有相同的哈希码,会发生什么?

据我所知,两个不相等的对象可以具有相同的哈希码。 在从HashMap java添加或检索时如何处理?

Object.hashCode()算法

我正在寻找Object.hashCode()的算法。 此代码在Object.java中是本机代码。 这是因为 (a)代码在汇编中 – 从来没有在Java或任何其他HLL中 要么 (b)根本没有披露 ? 在任何一种情况下,我都希望得到“如何计算hashCode()的算法(伪代码或一些详细的解释)” – 计算中的参数和计算本身是什么? 请注意:这是我正在寻找的Object的hashCode() –而不是像String或hashMap / table那样的 。 // ================================================ ========================== 新的Java文档 – jdk 8现在说 “The value returned by hashCode() is the object’s hash code, which is the object’s memory address in hexadecimal.”

为什么C#没有为集合实现GetHashCode?

我正在将一些东西从Java移植到C#。 在Java中, ArrayList的hashcode取决于其中的项。 在C#中,我总是从List获得相同的哈希码… 为什么是这样? 对于我的一些对象,哈希码需要不同,因为列表属性中的对象使对象不相等。 我希望哈希码对于对象的状态始终是唯一的,并且只在对象相等时等于另一个哈希码。 我错了吗?

自动检查equals,hashCode和compareTo的一致性的技巧?

我很清楚合同需要确保hashCode与equals一致,并且equals与compareTo一致。 但是,这在实践中经常被违反 。 是否有可以自动测试此一致性的工具,技术或库? 我怀疑不幸的是答案是“不”,但能够对这种可以利用库调用或框架的东西进行unit testing而不是需要手动编写自定义测试是有用的。每个重要的案例。 如果我不清楚我的一致性是什么意思,对于hashCode和equals ,请参考以下内容: 如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。 对于equals和compareTo我参考以下内容: 当且仅当e1.compareTo(e2)== 0具有与c的每个e1和e2的e1.equals(e2)相同的布尔值时,C类的自然排序被认为与equals一致。

Joshua Bloch在有效的java中建议如何在Java中使用缓存哈希码?

我有以下来自Joshua Bloch的有效java代码(第9章,第3章,第49页) 如果类是不可变的并且计算哈希代码的成本很高,您可以考虑在对象中缓存哈希代码,而不是在每次请求时重新计算它。 如果您认为此类型的大多数对象将用作哈希键,则应在创建实例时计算哈希码。 否则,您可能会在第一次调用hashCode时选择懒惰地初始化它(Item 71)。 目前尚不清楚我们的PhoneNumber课程是否值得这样做,只是为了向您展示它是如何完成的: // Lazily initialized, cached hashCode private volatile int hashCode; // (See Item 71) @Override public int hashCode() { int result = hashCode; if (result == 0) { result = 17; result = 31 * result + areaCode; result = 31 * result + prefix; result = 31 * […]