我有一个关于TreeSet集合和hashCode方法的快速问题.我有一个TreeSet并且我正在添加对象,在添加对象之前,我检查它是否存在于TreeSet使用该contains方法中.
我有2个不同的对象,每个对象使用我的hashCode方法实现产生一个不同的hashCode,例如:
public int hashCode()
{
int hash = 7;
hash = hash * 31 + anAttribute.hashCode();
hash = hash * 31 + anotherAttribute.hashCode();
hash = hash * 31 + yetAnotherAttribute.hashCode();
return hash;
}
Run Code Online (Sandbox Code Playgroud)
特定运行的hashCodes是:76126352和76126353(对象在一个属性中仅相差一位).
即使hashCodes不同,contains方法也会为这些对象返回true.有什么想法吗?这真的令人困惑,真的很感激帮助.
我一直在试图了解内部实现的java.util.HashMap和java.util.HashSet.
以下是我脑海中浮现的疑惑:
@Override public int hashcode()HashMap/HashSet中的重要性?这个哈希码在内部使用在哪里?String这样的myMap<String,Object>.我可以映射值someObject(而不是字符串)myMap<someObject, Object>吗?我需要遵守的所有合同成功发生了什么?提前致谢 !
编辑:
myMap.get(someKey);java时,内部调用someKey.hashCode()以获取哈希表中的数字以查找结果值?答:是的.
编辑2:
java.util.HashSet,从哪里为Hash表生成密钥?它来自我们正在添加的对象,例如.mySet.add(myObject);然后myObject.hashCode()将决定它在哈希表中的位置?(因为我们不在HashSet中给出键).答:添加的对象成为关键.价值是假的!
我们的项目包含几个类,我们有Eclipse生成的equals()和hashCode()方法(右键单击 - >源代码 - >生成hashCode()和equals()).
例:
Run Code Online (Sandbox Code Playgroud)@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final MyTO other = (MyTO) obj; if (num != other.num) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (table == null) { if (other.table != null) return false; } else if (!table.equals(other.table)) return false; return true; }
这些方法适用于我们的应用程序,但遗憾的是没有通过Checkstyle的圈复杂度检查.由于这些方法是自动生成的,因此我们不关心它们的复杂性.我们可以从Checkstyle中抑制整个类,但我们希望能够排除这两种方法. …
实现equals()和hashCode()简单的数据POJO使我的代码混乱,维护繁琐.
有哪些库自动处理?
由于性能原因,我更喜欢字节码检测而不是AOP方法.
更新:已经讨论了实现equals()和hashCode()的必要性的主题,这是我的观点:
以最小的努力提前完成它而不是挖掘代码,添加hC/eq是不是更好?
我在hashCode()为我创建的类编写方法时遇到了一些麻烦.此类旨在在TreeSet中使用,因此,它实现了Comparable.该类具有以下变量:
public class Node implements Comparable<Node> {
Matrix matrix;
int[] coordinates= new int[2];
Node father;
int depth;
int cost;
Run Code Online (Sandbox Code Playgroud)
这是该compareTo()方法的实现.我希望TreeSet按成本组织这些Node结构,因此,compareTo()返回简单减法的结果.
public int compareTo(Node nodeToCompare) {
return this.cost - nodeToCompare.cost;
}
Run Code Online (Sandbox Code Playgroud)
我还实现了一种equals()方法.
public boolean equals(Object objectToCompare) {
if(objectToCompare== this) {return true;}
if(objectToCompare== null || objectToCompare.getClass()!= this.getClass()) {return false;}
Node objectNode= (Node) objectToCompare;
return this.father.equals(objectNode.father) &&
this.depth== objectNode.depth &&
this.cost== objectNode.cost &&
this.matrix.equals(objectNode.matrix) &&
Arrays.equals(this.coordinates, objectNode.coordinates);
}
Run Code Online (Sandbox Code Playgroud)
说完这一切之后,我有几个问题:
equals()方法,我应该实现一个新hashCode() …我有一个对象,我想生成一个唯一的哈希(覆盖GetHashCode()),但我想避免溢出或不可预测的事情.
代码应该是组合一小组字符串的哈希码的结果.
哈希码将是生成缓存密钥的一部分,因此理想情况下它们应该是唯一的,但是被散列的可能值的数量很小所以我认为概率对我有利.
这样的事情是否足够并且有更好的方法吗?
int hash = 0;
foreach(string item in collection){
hash += (item.GetHashCode() / collection.Count)
}
return hash;
Run Code Online (Sandbox Code Playgroud)
编辑:感谢您的答案到目前为止.@Jon Skeet:不,订单并不重要
我想这几乎是另一个问题,但由于我使用结果生成缓存键(字符串)是否有意义使用像MD5这样的加密哈希函数或只使用此int的字符串表示?
我正在将一些东西从Java移植到C#.在Java中hashcode,a ArrayList取决于其中的项目.在C#中,我总是从List... 获得相同的哈希码
为什么是这样?
对于我的一些对象,哈希码需要不同,因为列表属性中的对象使对象不相等.我希望哈希码对于对象的状态始终是唯一的,并且当对象相等时仅等于另一个哈希码.我错了吗?
建议并且有时需要表示值(值类)的类来覆盖hashCode(),equals()[和可选toString()]方法.这些方法返回的值取决于类及其超类的所有成员变量或子集.要正确地实现它们,你必须要了解一些关于散列和一点代数和集合理论的理论(不要太多,几乎所有的东西都在这些方法的javadocs和有效的Java形式Josh Bloch中解释.)
在在大多数情况下,此方法的实现遵循模板,IDE(如Eclipse JDT)包含生成它们的工具.但是,工具生成器无法做出任何假设,只使用语言和标准库中提供的构造生成这些方法.因为这些方法通常看起来非常难看.
实现这些方法的另一种方法是使用图书馆像Apache的(公共琅)HashCodeBuilder,EqualsBuilder和ToStringBuilder.使用这些实用程序,可以实现自己的hashCode()和equals()方法,看起来好多了.
我的问题是关于这两种方法的结合.我希望能够自定义Eclipse hashCode()和equals()生成器,以便使用HashCodeBuilder和朋友生成它们.如果不调整JDT,是否可以(以及如何)这样做?只编写将覆盖默认实现的小插件(但不更改JDT代码).
谢谢.
据我所知,两个不相等的对象可以具有相同的哈希码.在从HashMap java添加或检索时如何处理?
我正在尝试为我的简单类生成一个hashCode()方法,但我没有得到它的任何地方.我将不胜感激任何帮助.我已经实现了equals()方法,如下所示,并且还想知道我是否需要实现compareTo()方法.我已经导入java.lang.Character来使用character.hashCode()但它似乎不起作用.
private class Coord{
private char row;
private char col;
public Coord(char x, char y){
row = x;
col = y;
}
public Coord(){};
public char getX(){
return row;
}
public char getY(){
return col;
}
public boolean equals(Object copy){
if(copy == null){
throw new NullPointerException("Object entered is empty");
}
else if(copy.getClass()!=this.getClass()){
throw new IllegalArgumentException("Object entered is not Coord");
}
else{
Coord copy2 = (Coord)copy;
if(copy2.row==this.row && copy2.col==this.col)
return true;
else
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢...
comparTo()方法给了我java.lang.Comparable转换错误..
public int …Run Code Online (Sandbox Code Playgroud) hashcode ×10
java ×9
equals ×3
c# ×2
eclipse ×2
gethashcode ×2
hashmap ×2
character ×1
checkstyle ×1
class ×1
collections ×1
compareto ×1
eclipse-jdt ×1
hash ×1
hashset ×1
treeset ×1