Java 设置hashcode和equals以创建具有唯一对象的集合
我将创建一个Java 设置hashcode和equals以创建具有唯一对象的集合,java,hash-code-uniqueness,Java,Hash Code Uniqueness,我将创建一个集确切地说哈希集以仅包含字符。例如a、b、c、d、e、f、g. 但是这些chars不是由原语类型表示的,但是我有一个对象 public FirstChar{ private char c; public FirstChar(char c){ this.c = c; } } 现在我想将对象FirstChar添加到一个集合中,但为了避免重复元素,我必须实现HashCode()和equals() 我知道如何实现equals,但如何实现hashcode,使集合中
集
确切地说哈希集
以仅包含字符
。例如a、b、c、d、e、f、g.
但是这些char
s不是由原语类型表示的,但是我有一个对象
public FirstChar{
private char c;
public FirstChar(char c){
this.c = c;
}
}
现在我想将对象FirstChar
添加到一个集合中,但为了避免重复元素,我必须实现HashCode()
和equals()
我知道如何实现equals
,但如何实现hashcode
,使集合中只有一个元素
注意。请不要让我使用Eclipse编辑:我刚刚阅读了您的评论,您只需要整个集合中的一个字母——这听起来很奇怪,但基本上是通过以下方式实现的:
public final class FirstChar {
private final char c;
public FirstChar(char c) {
this.c = c;
}
@Override public int hashCode() {
return 0;
}
@Override public boolean equals(Object other) {
return other instanceof FirstChar;
}
}
换句话说,FirstChar
的每个实例都被视为等同于其他每个实例,并且它们都具有相同的哈希代码。就像我说的,这真的很奇怪。。。这确实是你想要的吗
原始答案 为逻辑上只有一个字符的值实现
hashCode()
很容易:
@Override
public int hashCode() {
return c; // Use implicit conversion to int
}
检查Object.hashCode
的契约,您会发现这很好——假设您的方法基本上只是比较c
的值。(不清楚你在写“以我在集合中只能有一个元素的方式”时的意思——我假设你的意思是每个不同的字符只有一个元素。)
但是,我不清楚您的FirstChar
类提供了什么价值,而不仅仅是使用java.lang.Character
。你有什么理由不能只使用集合
?编辑:我刚读到你的评论,你只需要整个集合中的一个字母-这听起来很奇怪,但基本上是通过以下方式实现的:
public final class FirstChar {
private final char c;
public FirstChar(char c) {
this.c = c;
}
@Override public int hashCode() {
return 0;
}
@Override public boolean equals(Object other) {
return other instanceof FirstChar;
}
}
换句话说,FirstChar
的每个实例都被视为等同于其他每个实例,并且它们都具有相同的哈希代码。就像我说的,这真的很奇怪。。。这确实是你想要的吗
原始答案
为逻辑上只有一个字符的值实现hashCode()
很容易:
@Override
public int hashCode() {
return c; // Use implicit conversion to int
}
检查Object.hashCode
的契约,您会发现这很好——假设您的方法基本上只是比较c
的值。(不清楚你在写“以我在集合中只能有一个元素的方式”时的意思——我假设你的意思是每个不同的字符只有一个元素。)
但是,我不清楚您的FirstChar
类提供了什么价值,而不仅仅是使用java.lang.Character
。有什么原因不能只使用集合吗?在任何情况下,据我所知,Character
类中的hashCode
方法只是将char
作为int
返回
在您的特定情况下,如果您希望集合仅包含添加到其中的第一个FirstChar
,则可以使所有FirstChar
彼此相等:
class FirstChar{
private char c;
public FirstChar(char c){
this.c=c;
}
public String toString(){
return String.valueOf(c);
}
public boolean equals(Object o){
return o instanceof FirstChar;
}
public int hashCode(){
return 42;
}
}
但是除非你有很好的理由,否则这听起来不是个好主意。无论如何,据我所知,Character
类中的hashCode
方法只是将char
作为int
返回
在您的特定情况下,如果您希望集合仅包含添加到其中的第一个FirstChar
,则可以使所有FirstChar
彼此相等:
class FirstChar{
private char c;
public FirstChar(char c){
this.c=c;
}
public String toString(){
return String.valueOf(c);
}
public boolean equals(Object o){
return o instanceof FirstChar;
}
public int hashCode(){
return 42;
}
}
但是,除非你有很好的理由,否则这听起来不是个好主意。你希望每个“a”、“b”、“c”等最多有一个字符,还是整个集合中只有一个字符?是的,整个集合中只有一个字母set@Mazzy:那么您希望FirstChar
的每个实例与其他每个实例相等?这听起来很奇怪。也许您可以更详细地解释一下您的用例。您是希望每个“a”、“b”、“c”等最多有一个字符,还是整个集合中只有一个字符?是的,整个集合中只有一个字母set@Mazzy:那么您希望FirstChar
的每个实例与其他每个实例相等?这听起来很奇怪。也许你可以更详细地解释你的用例。Jon Skeet偶尔会赢得很多徽章,以至于通知会隐藏他的整个浏览器。他继续不受阻碍地回答问题。我之所以不使用包装字符,是因为每个字母都必须包含一个对象的集合,这些对象的姓氏以这个开头letter@Mazzy:这听起来像是一个非常奇怪的要求-你为什么不使用地图
或类似的东西(例如来自番石榴的Multimap
)?原因是我想要一个不重复的元素集合,但每个元素都必须包含一个列表,因此每个元素都必须是一个对象才能包含一个列表collection@JonSkeet但是地图有两个字段。键和值。现在我只需要一个字段。在集合中,我们可以有更多具有相同首字母“surna”的人me so Map无法帮助meJon Skeet偶尔赢得如此多的徽章,以至于通知隐藏了他的整个浏览器。他继续不受阻碍地回答问题。我不使用包装字符的原因是因为每个字母都必须包含一组以该名称开头的对象letter@Mazzy这听起来很奇怪irement-您不使用地图
或类似物品的任何原因(例如,番石榴的多地图
)?原因是我想要一个不重复的元素集合,但每个元素都必须包含一个列表,因此每个元素都必须是一个对象才能包含一个列表collection@JonSkeet但是地图有两个字段。键和值。现在我只需要一个字段。在集合中,我们可以有更多具有相同首字母“surna”的人所以地图帮不了我