使用HashSet存储自定义对象


一、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());
        }
    }


}

3.结果

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值