一、HashSet唯一性原理
新添加到HashSet集合的元素都会与集合中已有的元素一一比较
- 首先比较哈希值(每个元素都会调用hashCode()产生一个哈希值)
- 如果新添加的元素与集合中已有的元素的哈希值都不同,新添加的元素存入集合
- 如果新添加的元素与集合中已有的某个元素哈希值相同,此时还需要调用equals(Object obj)比较
- 如果equals(Object obj)方法返回true,说明新添加的元素与集合中已有的某个元素的属性值相同,那么新添加的元素不存入集合
- 如果equals(Object obj)方法返回false, 说明新添加的元素与集合中已有的元素的属性值都不同, 那么新添加的元素存入集合
二、如何使用HashSet保证对象唯一?
1.自定义对象
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "民评选项赋值Po", description = "民评选项赋值Po")
public class DatOptionScorePo extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
private Long id;
@ApiModelProperty(value = "所属名评表模板id")
private Long belongTempId;
@ApiModelProperty(value = "选项组id")
private Long groupId;
@ApiModelProperty(value = "选项名称")
private String name;
@ApiModelProperty(value = "分数")
private Integer score;
@ApiModelProperty(value = "排序")
private Integer sort;
}
2.重写 hashCode和equals
此处重新hashCode和equals,根据Id保证唯一,可以根据需求自定义。
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "民评选项赋值Po", description = "民评选项赋值Po")
public class DatOptionScorePo extends BaseEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "id")
private Long id;
@ApiModelProperty(value = "所属名评表模板id")
private Long belongTempId;
@ApiModelProperty(value = "选项组id")
private Long groupId;
@ApiModelProperty(value = "选项名称")
private String name;
@ApiModelProperty(value = "分数")
private Integer score;
@ApiModelProperty(value = "排序")
private Integer sort;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DatOptionScorePo that = (DatOptionScorePo) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
3.测试
public class Test {
public static void main(String[] args) {
//创建HashSet<Student>对象
HashSet<DatOptionScorePo> set=new HashSet<DatOptionScorePo>();
//添加信息
DatOptionScorePo datOptionScorePo = new DatOptionScorePo();
datOptionScorePo.setId(1L);
DatOptionScorePo datOptionScorePo2 = new DatOptionScorePo();
datOptionScorePo2.setId(1L);
DatOptionScorePo datOptionScorePo3 = new DatOptionScorePo();
datOptionScorePo3.setId(2L);
set.add(datOptionScorePo);
set.add(datOptionScorePo2);
set.add(datOptionScorePo3);
System.out.println("HashSet的size大小为"+set.size());
//遍历
for(DatOptionScorePo s:set) {
System.out.println(s.getId()+" "+s.getId());
}
}
}