hashCode()和equals()的区别和联系

equals()是对象类object的基础方法,可以被重写,如果不重写,意义和==没有区别(string类默认重写了equals方法和hashCode方法).

hashCode()生成的是散列值,在散列表中有用,散列表通过散列值可以快速的定位数据位置,支持散列表的集合像HashMap.HashSet等.

散列表判断相等是hashCode和equal都相等的对象才为相等下面用代码证明:

public class Main {
    public static void main(String[] args) {
        P p1=new P("a",1);
        P p2=new P("a",1);
        P p3=new P("b",2);
        Set set= new HashSet();
        set.add(p1);
        set.add(p2);
        set.add(p3);
        System.out.printf("%s%n",set);
        System.out.println(p1.equals(p2)+";"+p1.equals(p3)+";"+p1.hashCode()+";"+p2.hashCode()+";"+p3.hashCode());
    }

    static class P {
        private String a;
        private Integer b;
        P(String a,Integer b){
            this.a=a;
            this.b = b;
        }

        @Override
        public String toString() {
            return "["+a+","+b+"]";
        }
    }
}

返回结果:

[[b,2], [a,1], [a,1]]
false;false;1987083830;1632492873;525683462

可见没有重写equals方法和hashCode方法,equels方法和hashSet都不承认p1和p2相等.

修改代码,增加hashCode方法的重写:

@Override
        public int hashCode(){
            int aHash =  a.toUpperCase().hashCode();
            return aHash;
        }

返回结果:

[[a,1], [a,1], [b,2]]
false;false;65;65;66

可见没有重写equals方法,equels方法和hashSet都不承认p1和p2相等.

修改代码,去掉hashCode方法的重写,增加equals方法的重写:

@Override
        public boolean equals(Object object){
            P temp = (P)object;
            boolean ares = temp.a.equals(this.a);
            boolean bres = temp.b.equals(this.b);
            return ares&&bres;
        }

返回结果:

[[b,2], [a,1], [a,1]]
true;false;1987083830;1632492873;525683462

可见没有重写hashCode方法,hashSet都不承认p1和p2相等.

增加hashCode方法,equals方法的重写:

@Override
        public int hashCode(){
            int aHash =  a.toUpperCase().hashCode();
            return aHash;
        }
@Override
        public boolean equals(Object object){
            P temp = (P)object;
            boolean ares = temp.a.equals(this.a);
            boolean bres = temp.b.equals(this.b);
            return ares&&bres;
        }

返回结果:

[[a,1], [b,2]]
true;false;65;65;66

可见equels方法和hashSet都承认p1和p2相等.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值