java if equals_来说说 Java中的“==”和“equals”

千里之行,始于足下。

在Java日常开发中,经常会遇见判断两个对象或者两个值是否相等的情况,而常用的判断方法就是“==”和“equals”,今天就来说说这两个的区别。

“==”

主要用来判断两个对象的引用地址是否相同;

所以如果“==”两边的是两个对象,那么判断的就是是否为同一对象;

注1:如果对象的引用值是放在常量池中,例如字符串,相同字符串的引用地址相同,所以“abc"=="abc"的结果为true。而通过new String()来声明的,由于引用地址不同,new String("abc") == new String("abc") 结果为false。

String A = "abc";

String B = "abc";

System.out.println(A == B); //true

String a = new String("abc");

String b = new String("abc");

System.out.println(a == b); //false

//ps:这里String推荐使用equals来判断是否相等,因为是举例说明问题,所以强行用了==

注2:当判断基本类型时,是直接比较引用指向堆里面的具体值。

“equals”

equals是Object类中的一个方法,其默认是使用“==”来判断两个对象是否相等:

public boolean equals(Object obj) {

return (this == obj);

}

所以如果一个对象没有重写equals方法,那么对比都是引用地址。

equals要求满足几个特性:

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

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

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

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

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

而在日常使用中已经重写了equals的常用类,有String,Integer等。

String:

直接上源码:

public boolean equals(Object anObject) {

if (this == anObject) { //判断引用地址是否相等

return true;

}

if (anObject instanceof String) { //传入的参数是否为String

String anotherString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) { //判断两个字符串长度是否相等

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) { //循环判断两个字符串的每一位字符

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

可以看到,当引用地址不相同时,String的equals时判断两个字符串的长度和每一位字符是否相等。

Integer:

还是直接上源码:

public boolean equals(Object obj) {

if (obj instanceof Integer) {

return value == ((Integer)obj).intValue(); //这里的value是int类型的

}

return false;

}

Integer的equals是把两个Integer对象转化成基本类型int再通过==进行比较。

说到Integer,说一个遇到的坑:

Integer a = Integer.valueOf("127");

Integer b = Integer.valueOf("127");

Integer c = Integer.valueOf("128");

Integer d = Integer.valueOf("128");

System.out.println(a==b); //true

System.out.println(c==d); //false

这里是因为,对于Integer的valueOf存在一个-128~127缓存:

public static Integer valueOf(int i) {

if (i >= IntegerCache.low && i <= IntegerCache.high) //low=-128,high=127

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

所以当值在缓存里的时候,valueOf并没有new 对象,从而导致里a==b为true。所以对于Integer大小的判断,推荐使用equals。

总结

“==”和“equals”在没有重写Object里equals方法的类里,他们是一样的。

而在日常的开发过程中,类里可以重写equals方法用来判断两个类是否相同。例如对于一个以手机号为唯一标识的项目里,可以只判断手机号就能确认两个对象是否相等。

ps:再多说一句,一般重写equals时也会重写hashCode方法,至于为什么重写hashCode方法,下次再说吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值