重写hashcode方法,加入set

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>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值