关于hashcode、equals、==

这两天在研究集合类的效率问题的时候注意到了hash算法,当初理解的hashcode、equals、==这三个的区别,主要是为了面试,一开始看了很多资料,翻阅了java核心技术后,有一次加深了理解:
B a=new B("qq");

B b=new B("qq");
System.out.println( a==b );
System.out.println(a.equals(b));

System.out.println(a.hashCode()==b.hashCode());

B是我随便定义的一个类,这里打印结果是
false
false
false

理解起来也很简单,就是这里是实例话2个实例,所以第一个的引用地址值不相等,而B中没有override没有覆盖父类的equals和hashcode的方法,所以还是集成父类的方法,即object类,所以这里的equals和==的作用一样;对象不同,hashcode也不同。
String c=new String("1111");
String d=new String("1111");
System.out.println( e==d );
System.out.println(e.equals(c));

System.out.println(e.hashCode()==d.hashCode());

结果是:
false
true
true
new的实例不同,所以引用的地址值不同; 第二个true是因为Integer、String等的类型中重写equals方法,即这里不是用的是object类的equals方法,已经被重写了,如果是我们自己定义的类 ,当有可能被比较的时候要重写equals和hashcode方法; 第三个true和第二个是同的;

说了那么多需要记住的是面试要用的:
equals()相等的两个对象,hashcode()一般是相等的,最好在重写equals()方法时,重写hashcode()方法; equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。 反过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。

开发中对基本类型和string的相等用==和equals就行了, 如果是对象用instanceof判断即可


hashcode主要是用在set集合中,为了加快判断存储的速度,就先判断hashcode是否等,不等对象就肯定不等,就可以存进去了 。避免了重复存储。


此处是我看的几个还行的blog:
[url]http://hi.baidu.com/lywlx2013526/item/b670da1299fbce6871d5e82b[/url]


[url]http://blog.csdn.net/songjie521/article/details/3368386[/url]
[url]http://blog.163.com/lxy_rk/blog/static/8756380520090292924202/[/url]
[url]http://zhidao.baidu.com/question/346261617.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值