equals、hashCode、==

==

==   基本类型  比较的是值  ,   引用类型  比较的是地址值.

int a=127; int b=127;

System.out.println("inta==intb:" + (a== b));       返回的是  true

int a=128;  int  b=128;

System.out.println("inta==intb:" + (a== b));       返回的是  flase

-128~127内会进入缓存,超过就会new.

String a=new String("1");

String b=new String("1");

System.out.println("String a==String b:" + (a== b));    返回的是flase

String a="1";

String b="1";

System.out.println("String a==String b:" + (a== b));   返回值是true

Integer a= new Integer(12);  

int b=12;

System.out.println("inta==intb:" + (a== b));   返回值是true

即使是相同的值只要是不同new,的地址值就不同,除非他是同一个new出来比较.

基本类型和相同的包装类型,比较会自动拆箱变为基本类型所有比较的不是地址值.


这里S1==S2,是true ,S1==S3是false;

S1==S2是true因为,"a"+"b+"c"是字符串常量,常量优化机制,应该去常量池中创建"abc",但是当常量池中已经abc了,S2就不会再去创建常量,所有就相等.

S1==S3是false因为,在JDK1.6中所有的字符串用+连接,底层都是用stringBuilder或者StringBuffer拼接,然后toString.所有地址是不一致的.


equals

equals  比较的就是地址值.

即String中equals方法判断相等的步骤是:

1.若A==B 即是同一个String对象 返回true

2.若对比对象是String类型则继续,否则返回false

3.判断A、B长度是否一样,不一样的话返回false

4。逐个字符比较,若有不相等字符,返回false

这里对equals重新需要注意五点:

1   自反性:对任意引用值X,x.equals(x)的返回值一定为true.

2   对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;

3   传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true

4   一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变

5   非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

hashCode

如果a.equals(b),则一定有a.hashCode() 一定等于 b.hashCode()。 

如果!a.equals(b),则a.hashCode() 不一定等于 b.hashCode()。此时如果a.hashCode() 总是不等于 b.hashCode(),会提高hashtables的性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。