==和equals方法的区别是什么?hashCode方法的作用?
先说==:
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量说对应的内存中所存储的数值是否相等.要比较两个基本数据类型或者两个引用变量是够相等,只用==.
如果一个变量指向的数据是对象类型,那么就涉及了两块内存,对象本身占用一块堆内存,变量也占用一块内存,
例如:Object obj=newObject();
obj是一个内存,new Object()是另一个内存.此时变量obj所对应的内存中存储的数值占用的那块内存的首地址.
对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,就要看这两个变量所对应的内存中的数字是否相等,此时用==操作符来进行比较.
再说equals:
它用于比较两个独立对象的内容是否相等,就好比对比两个人长相是否相同,他比较的两个对象是独立的.
例如: String a=new String(“foo”); String b=new String(“Foo”);
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中的一个对象,这是两个不同的对象,他们的首地址是不同的,即,ab中存储的数字是不相同的,所以,表达式a==b返回的是false,而这两个对象同的内容是相等的,所以,要用a.equals(b),返回true.
字符串的比较基本上是用equals.
额外的一些细节:
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
Boolean equals(Object o){return this==o;}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object类继承)就是使用==操作符,也是在比较两个变量指向的对象是否同一个对象,使用equals和==会得到同样的结果.若比较的是独立的对象就总返回false.所以一些情况下,需要覆盖equals方法.
然后就是关于hashCode方法.
hashCode和equals都是用来判断2个对象是否相等.但他们区别比较大.
一般来说,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用哪个,就可以判断他们是否相等了,简单的来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是否相等.如有个学生类,属性只有姓名和性别,我们可以认为只要姓名和性别相等,那么就说着2个对象是相等的.
Hashcode方法,一般用户不会去调用,比如在hashmap中,由于ket是不可以重复的,他在判断ket是不是重复的时候就使用了hashcode这个方法,而且也用到了equals方法,这里不可以重复是说equals和hashcode只要有一个不等就可以了!所以简单来说,hashcode相当于是一个对象的编码,就好象文件中的md5,他和equals不同就在于他返回的是int型的.比较起来不直观.我们一般在覆盖equals的同时,也要覆盖hashcode,让他们的逻辑一致.如上述例子,如果姓名和性别相等,那么hashcode的方法也要返回姓名和性别的hashcode值,这样从逻辑上,他们就一致了.
==是物理上的判断是否相等,就是内存上判断.