这两天在研究集合类的效率问题的时候注意到了hash算法,当初理解的hashcode、equals、==这三个的区别,主要是为了面试,一开始看了很多资料,翻阅了java核心技术后,有一次加深了理解:
B是我随便定义的一个类,这里打印结果是
理解起来也很简单,就是这里是实例话2个实例,所以第一个的引用地址值不相等,而B中没有override没有覆盖父类的equals和hashcode的方法,所以还是集成父类的方法,即object类,所以这里的equals和==的作用一样;对象不同,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]
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]