如何重写hashcode和equals方法,以避免在java的HashSet中添加重复字符串?

如何重写hashcode和equals方法,以避免在java的HashSet中添加重复字符串?,java,equals,hashcode,hashset,java-collections-api,Java,Equals,Hashcode,Hashset,Java Collections Api,在我的代码中,我有一组对象的位置,即 Set<PlacesInfo> placeId; 下面的代码工作正常。如果删除equals和hashcode,它将添加两个元素。 导入java.util.HashSet; 导入java.util.Objects; 导入java.util.Set; 类位置信息{ intplaceid; 公共int getId(){ 返回placeId; } PlacesInfo(int placeId){ this.placeId=placeId; }

在我的代码中,我有一组对象的位置,即

 Set<PlacesInfo> placeId;    
下面的代码工作正常。如果删除equals和hashcode,它将添加两个元素。
导入java.util.HashSet;
导入java.util.Objects;
导入java.util.Set;
类位置信息{
intplaceid;
公共int getId(){
返回placeId;
}
PlacesInfo(int placeId){
this.placeId=placeId;
}
公共void setId(int placeId){
this.placeId=placeId;
}
@凌驾
公共布尔等于(对象obj){
if(obj==null)
返回true;
如果(this.getClass()!=obj.getClass())
返回false;
最终地点信息其他=(地点信息)obj;
如果(!Objects.equals(this.placeId,other.placeId))
返回false;
返回true;
}
@凌驾
公共int hashCode(){
int hash=5;
hash=97*hash+Objects.hashCode(this.placeId);
返回散列;
}
}
公开课考试{
公共静态void main(字符串[]args){
PlacesInfo t1=新PlacesInfo(1);
PlacesInfo t2=新PlacesInfo(1);
系统输出println(t1等于(t2));
Set templast=newhashset(2);
添加(t1);
圣殿骑士。添加(t2);
System.out.println(圣殿骑士);
}
}
试试这个

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((placeId == null) ? 0 : placeId.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    PlacesInfo other = (PlacesInfo) obj;
    if (placeId == null) {
        if (other.placeId != null)
            return false;
    } else if (!placeId.equals(other.placeId))
        return false;
    return true;
}
试试看。我已将GAgarwal解决方案简化为一个平凡的类

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@EqualsAndHashCode(of={"placeId"})
public class PlacesInfo{

        @Getter; @Setter;
        int placeId;

        PlacesInfo(int placeId) {
            this.placeId = placeId;
        }
}
龙目山由马文提供。您不需要将其包含在最终的jar中。仅用于编译

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.14.8</version>
    <scope>provided</scope>
</dependency>

org.projectlombok
龙目
1.14.8
假如

我假设给定的
hashCode
equals
方法是
PlacesInfo
类的一部分。我无法使用
HashSet
使用您的方法复制此内容。更多的代码可能有助于追踪bug。首先,你的
equals
方法说你的所有对象都等于null。什么类型是
placeId
?使用eclipse,右键单击文件->转到源代码->生成hashcode equals,现在选择你想要包含的类字段进行比较,然后说OK:),它将为您生成标准的equals和hascode方法。感谢您的回复
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

@EqualsAndHashCode(of={"placeId"})
public class PlacesInfo{

        @Getter; @Setter;
        int placeId;

        PlacesInfo(int placeId) {
            this.placeId = placeId;
        }
}
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.14.8</version>
    <scope>provided</scope>
</dependency>