java中set方法自定义_在Set集合中添加自定义的对象

讨论的问题:众所周知,set集合的特点是无重复的元素。一般Java类库中的类型比如String 类在添加到set中后,是不会出现重复现象的。那么自定义的类呢?

1.创建自定义类

public classDog {privateString name;privateString kind;privateString hobby;publicDog(String name,String kind,String hobby) {this.hobby=hobby;this.kind=kind;this.name=name;

}publicString getName() {returnname;

}publicString getKind() {returnkind;

}publicString getHobby() {returnhobby;

}

@OverridepublicString toString() {return "Dog [name=" + name + ", kind=" + kind + ", hobby=" + hobby + "]";

}

2.测试

public classTestSet {public static voidmain(String[] args) {

Set dogs=new HashSet<>();

Dog dog=new Dog("huahua","tianyuan","run");

Dog dog1=new Dog("tiantian","hashiqi","eat");

Dog dog2=new Dog("qiqi","jinmao","smell");

Dog dog3=new Dog("qiqi","jinmao","smell");

dogs.add(dog);

dogs.add(dog1);

dogs.add(dog2);

dogs.add(dog3);

System.out.println(dogs);

}

}

3.结果:

[Dog [name=qiqi, kind=jinmao, hobby=smell], Dog [name=huahua, kind=tianyuan, hobby=run], Dog [name=tiantian, kind=hashiqi, hobby=eat], Dog [name=qiqi, kind=jinmao, hobby=smell]]

4.分析:

可以看到在结构中有两个重复的元素。

自定义类的情况下,需要重写hashcode()和equals()方法,Object中的equals()仅能判断两个对象是否具有相同的引用,不能判断对象的内容细节,所以需要重写。

Note:hashcode是根据类的实例域生成的一个随机的整数,可为负。只要两个对象相同,他们的hashcode码就相同。

5.改进:在Dog类中重写如下方法:

@Overridepublic inthashCode() {final int prime = 31;int result = 1;

result= prime * result + ((hobby == null) ? 0: hobby.hashCode());

result= prime * result + ((kind == null) ? 0: kind.hashCode());

result= prime * result + ((name == null) ? 0: name.hashCode());returnresult;

}

@Overridepublic booleanequals(Object obj) {if (this ==obj)return true;if (obj == null)return false;if (getClass() !=obj.getClass())return false;

Dog other=(Dog) obj;if (hobby == null) {if (other.hobby != null)return false;

}else if (!hobby.equals(other.hobby))return false;if (kind == null) {if (other.kind != null)return false;

}else if (!kind.equals(other.kind))return false;if (name == null) {if (other.name != null)return false;

}else if (!name.equals(other.name))return false;return true;

}

6.结果:

[Dog [name=tiantian, kind=hashiqi, hobby=eat], Dog [name=qiqi, kind=jinmao, hobby=smell], Dog [name=huahua, kind=tianyuan, hobby=run]]

不再有重复的元素!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值