我是否需要定义自己的 hash 和 equal 方法?
Whether I need to define my own hash and equal method?
如果我需要使用 InfoName
作为 HashMap
的 key
,我是否需要定义自己的 hashCode()
和 equals()
方法?我认为没有必要,因为 String name
变量足以确保 InfoName
的每个对象都不同。
public class InfoName {
enum Type {
company, product;
}
public String name;
public Type type;
public InfoName(String name, Type type) {
this.name = name;
this.type = type;
}
}
the String "name" variable will be enough to make sure each object of
InfoName is different
如果您只想在 InfoName
中使用 name
,那么只需让 String
键入 name
作为 key
,因为它已经覆盖equals()
和 hashCode()
.
或
您需要覆盖 InfoName
class 中的 equals()
和 hashCode()
,否则 JVM 如何知道您正在使用哪个 attribute/criteria 进行散列和相等性检查。
如果您确定将 InfoName 作为键,则需要覆盖两者。
你有类似
的东西
public class Test {
enum Type {
company, product;
}
public String name;
public Type type;
public Test(String name, Type type) {
this.name = name;
this.type = type;
}
@Override
public boolean equals(Object o) {//or do what you like
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Test test = (Test) o;
if (!name.equals(test.name)) return false;
if (type != test.type) return false;
return true;
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + type.hashCode();
return result;
}
}
基本上,您的编辑器提供了覆盖哈希码和等号的功能。看这里 Why do I need to override the equals and hashCode methods in Java?enter link description here
I think it's not necessary, since the String "name" variable will be
enough to make sure each object of InfoName is different.
我建议不要使用 name
作为散列键,因为它看起来不太合适。我的意思是您可以拥有多个具有相同产品名称的对象吗?在那种情况下,你会发生很多碰撞。
如果我需要使用 InfoName
作为 HashMap
的 key
,我是否需要定义自己的 hashCode()
和 equals()
方法?我认为没有必要,因为 String name
变量足以确保 InfoName
的每个对象都不同。
public class InfoName {
enum Type {
company, product;
}
public String name;
public Type type;
public InfoName(String name, Type type) {
this.name = name;
this.type = type;
}
}
the String "name" variable will be enough to make sure each object of InfoName is different
如果您只想在 InfoName
中使用 name
,那么只需让 String
键入 name
作为 key
,因为它已经覆盖equals()
和 hashCode()
.
或
您需要覆盖 InfoName
class 中的 equals()
和 hashCode()
,否则 JVM 如何知道您正在使用哪个 attribute/criteria 进行散列和相等性检查。
如果您确定将 InfoName 作为键,则需要覆盖两者。 你有类似
的东西public class Test {
enum Type {
company, product;
}
public String name;
public Type type;
public Test(String name, Type type) {
this.name = name;
this.type = type;
}
@Override
public boolean equals(Object o) {//or do what you like
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Test test = (Test) o;
if (!name.equals(test.name)) return false;
if (type != test.type) return false;
return true;
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + type.hashCode();
return result;
}
}
基本上,您的编辑器提供了覆盖哈希码和等号的功能。看这里 Why do I need to override the equals and hashCode methods in Java?enter link description here
I think it's not necessary, since the String "name" variable will be enough to make sure each object of InfoName is different.
我建议不要使用 name
作为散列键,因为它看起来不太合适。我的意思是您可以拥有多个具有相同产品名称的对象吗?在那种情况下,你会发生很多碰撞。