package java_bishi;
import java.util.HashSet;
/**重写hashcode方法
* Created by zsm on 16-10-2.
* set在存储元素之前,先比较hashcode,如果hashcode相同的话则不予存取;
* 如hashcode不同的话在比较equals。
*
*比如a1和a3这两个根本不同的对象,就没有必要去比较equals,增加无谓的计算量。
* 所以应该对象本身的内容 (属性)来重写hashCode。
一旦两个对象内部不一样,就直接判定出hashCode不一样,不用再调用equals进行比较。
*/
class Person{
private String name;
private int age;
public static void sop(Object o){
System.out.println(o);
}
public Person(String name, int age){
this.name =name;
this.age =age;
}
public void setName(String name){
this.name =name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age =age;
}
public int getAge(){
return this.age;
}
public String toString(){
return this.name+"::"+this.age;
}
/* public int hashCode(){
System.out.println(this.name +"...hashCode");
return 60;
}*/
public int hashCode(){
sop(this.name +"......hashCode");
return this.name.hashCode() + 29*age;
//通过Person的这两个属性name和age的线性组合来获取这个Person的hashCode值。
}
//equals已经重写
public boolean equals(Object obj){
if(!(obj instanceof Person)){
return false;
}
Person p =(Person)obj;
//用来查看equals方法是否被调用
sop(this.name +".......equals......."+ p.name);
//认为名字相同并且年龄一样大的两个对象是一个
return this.name.equals(p.name) && this.age == p.age;
}
public static void main(String[] args) {
HashSet<Person> p=new HashSet<>();
Person a=new Person("a1",11);
Person a2=new Person("a2",12);
Person a22=new Person("a2",12);
Person a3=new Person("a3",13);
p.add(a);
p.add(a2);
p.add(a3);
p.add(a22);//如果没有重写hashcode和equals方法的话,可以加入set。
//因为Person的equals方法继承了object类,默认的是用==比较对象的地址!!
// a2 a22的地址肯定不同,所以可以添加。
// 重写了hashcode和equals方法之后,防止重复添加。
System.out.println(p.size());
HashSet<String>h=new HashSet<>();
String ss=new String("syz");
String sss=new String("syz");
h.add(ss);
h.add(sss);
//String重写了equals方法,比较内容
System.out.println(h.size());
}
}
参考:<h1 style="TexT-ALiGn: left; pADDinG-BoTToM: 0px; Line-HeiGHT: 26px; TexT-TrAnsForM: none; BACKGroUnD-CoLor: rgb(255,255,255); FonT-VAriAnT: normal; FonT-sTYLe: normal; TexT-inDenT: 0px; MArGin: 0px; pADDinG-LeFT: 0px; pADDinG-riGHT: 0px; FonT-FAMiLY: Arial; WHiTe-spACe: normal; LeTTer-spACinG: normal; CoLor: rgb(0,0,0); WorD-spACinG: 0px; pADDinG-Top: 0px; -webkit-text-stroke-width: 0px"><a target=_blank href="http://blog.csdn.net/benjaminzhang666/article/details/9468605"><span style="font-size:14px;">http://blog.csdn.net/benjaminzhang666/article/details/9468605</span></a></h1>
重写hashcode方法,加入set
最新推荐文章于 2023-10-05 21:16:36 发布