equals、hashCode、==
发布网友
发布时间:2023-08-05 10:34
我来回答
共1个回答
热心网友
时间:2024-11-29 13:31
== 基本类型 比较的是值 , 引用类型 比较的是地址值.
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 比较的就是地址值.
即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
如果a.equals(b),则一定有a.hashCode() 一定等于 b.hashCode()。
如果!a.equals(b),则a.hashCode() 不一定等于 b.hashCode()。此时如果a.hashCode() 总是不等于 b.hashCode(),会提高hashtables的性能。