Tag: 哈希码

为具有浮点成员的类实现“容忍”`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中hashcode方法的目的是什么?

当我们有equals() , compareTo()方法为什么Java中有hashcode()方法? 如果我们使用HashTable我们必须覆盖hashcode()方法,除了快速访问随机密钥之外还有什么特殊原因吗? 如果我们覆盖hashcode()方法,那么可能的实现是什么? Java如何确保内存中的对象唯一性? Hashcodes are typically used to enhance the performance of large collections of data 。 在hashing我们计算hash code 。 这是一项额外的任务。 当我们为添加到集合的每个对象执行其他操作时。 性能如何提高?

有什么方法可以使hashCode / equals与类的业务定义保持一致?

对象javadocs和Josh Bloch告诉我们如何实现hashCode / equals,好的IDE将正确处理各种类型的字段。 关于这一切的一些讨论。 这个问题是关于下一步:你如何确保它们保持良好状态? 特别是,我觉得对于大多数类来说,equals / hashCode应该像Bloch建议的那样实现(以及Eclipse和其他IDE的实现),并考虑到该类中所有非派生的业务逻辑字段。 在将新字段添加到类中作为继续工作的一部分时,人们常常忘记将它们添加到equals / hashCode实现中。 当两个对象看起来相等时,这可能导致难以发现的错误,但实际上不同于最近引入的字段的值。 一个团队(甚至一个团队!)如何帮助确保类的equals / hashCode继续考虑所有相关字段,因为成员字段会发生变化? 我知道Apache的EqualsBuilder和HashCodeBuilder可以使用reflection,显然会考虑正确的字段,但我想避免使用它们的性能成本。 是否有其他方法来标记未包含在equals / hashCode中的字段,应该是什么? 静态代码分析,IDEfunction,unit testing技术?

Java中String的hashCode()方法背后的内容是什么?

我一直在调查java中的hashCode()方法,并发现String类的奇怪之处。 源代码如下: public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; } 代码本身非常简单。 但我想知道以这种方式计算哈希码的原因是什么? 为什么选择31? 为什么从0开始而不是value.length – 1? 是否保证这会使哈希码更不可能相互冲突?

为什么即使我的hashcode值相同,’==’也会返回false

我写了一个类似的课程 public class HashCodeImpl{ public int hashCode(){ return 1; } public static void main(String[] args) { // TODO Auto-generated method stub HashCodeUtil h= new HashCodeUtil(); HashCodeUtil h1= new HashCodeUtil(); System.out.println(h.hashCode()); System.out.println(h1.hashCode()); System.out.println(h); System.out.println(h1); System.out.println(h==h1); } } 输出: 1 com.manu.test.HashCodeUtil@1 com.manu.test.HashCodeUtil@1 false 我的问题是:当我的hashCode方法返回相同的值时,为什么System.out.println(h==h1); 是假的? 请解释。

Java String上哈希码溢出的后果

我最近在这里阅读了一些关于Java String类’哈希码的内容,并且我无法找到这些信息:当字符串的长度大于32时会发生什么(我知道会发生溢出,但是作为哈希键, 怎么了)? 例如,我需要散列长度在20到120个字符之间的字符串,以将它们用作散列键。 我是否需要使用BigInteger实现自己的算法? 另外,由于我可能有30k到80k之间的字符串,或许更多,通常的String hashcode是否足够无冲突?

Eclipse生成的Hashcode

在SO中,我已经阅读了几个与hashcode实现相关的答案以及使用XOR运算符的建议。 (例如, 为什么XOR经常在java hashCode()中使用,但很少使用其他按位运算符? )。 当我使用Eclipse生成hashcode函数时, field是一个对象, timestamp是long,输出是: public int hashCode() { final int prime = 31; int result = 1; result = prime * result + field == null) ? 0 : field.hashCode()); return result; } 有没有理由不使用下面的XOR运算符? result = prime * result + (int) (timestamp ^ (timestamp >>> 32));

如果重写哈希代码,Hashmap键如何表现,只返回一个常数?

我有一个关于Java Hashmap的小问题。 如果我覆盖hashCode方法,使得: @Override public int hashCode(){ return 9; } 这将导致所有HashMap键具有相同的索引。 它们是否会被放置在地图中的链表结构中,还是地图只包含替换所有其他键的最后一个键?

Java 1.7覆盖hashCode()的行为与我的预期不符

我有一个类,我已经覆盖了hashCode方法和equals方法。 equals方法的行为与我期望的一样,但是hashCode方法似乎没有像我期望的那样运行。 我假设因为我的期望不正确,但不确定原因。 以下是重写方法: public class Car extends SomeBaseClass implements Cloneable, Serializable { private static final long serialVersionUID = 1L; private String id; private String name; private String carName; private String carModel; private String displayTextCar; public boolean equals(Car car) { return (getCarName().equals(car.getCarName()) && getCarModel().equals(car.getCarModel())); } public int hashCode() { return (this.getCarName() + this.getCarModel()).hashCode(); } 现在我有一个测试类,在其中创建两个car对象,并调用equals方法,然后将每个car实例放入HashMap。 […]

Java中的equals()和hashCode()契约

Bert Bates和Kathy Sierra的SCJP 6学习指南在第554页(以及其他要求中)指出x.hashCode()!= y.hashCode()要求x.equals(y)== false 。 但是Javadoc for Object没有明确提到这样的要求。 引用: 如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。 我应该采用Javadoc所说的物质含义,例如eq – > hc ? 那么这两个来源之间就不会有冲突。