讨论的问题:众所周知,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]]
不再有重复的元素!