Java 的equals和==区别
String str1=new String(“str”);
String str2=new String (“str”);
System.out.println(str1==str2); //false;
System.out.println( str1.equals(str2) ); //true;
String str3=”str1”;
String str4=”str1”;
System.out.println(st3==str4); //true
System.out.println( str3.equals(str4) );//true
可以发现:
equals无论是自动装箱来实例化还是用new 来实例化 返回结果都是true
而==则不一样,自动装箱返回的是true,用new 返回的是false
Equals 是用来判断两个对象的内容是否相等,而== 是判断两个对象的地址是否相等,是否指向同一对象。
在最初对所有类的基类中,equals方法定义如下:
Public boolean equals(Object obj)
{
return (this==obj);
}
可以看出这里定义的equals和==是等效的,但是String类对equals进行了重写
public boolean equals(Object anObject) {
if(this == anObject) {
return true;
}
if(anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return 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
补充:
Integer 类的情况
inti=0;
Integerj = newInteger(0);
System.out.println(i==j);//true
System.out.println(j.equals(i));//true
基本类型与 Integer 的比较, j 会自动拆箱成 int 类型,然后比较的是值。因此返回真;
j.equals(i) ,调用 equals 方法后,这个 i 会自动装箱成 Integer 类型,然后再比较值,所以也返回真;
一般说来,如果是两个Integer类型进行==比较,就是比较两个Integer对象的地址。
但是有一点需要注意的是在-128至127这个区间,如果创建Integer对象的时候(1)Integer i = 1; (2) Integer i = Integer.valueOf(1);如果是这两种情况创建出来的对象,那么其实只会创建一个对象,这些对象已经缓存在一个叫做IntegerCache里面了,所以==比较是相等的。
如果不在-128至127这个区间,不管是通过什么方式创建出来的对象,==永远是false,也就是说他们的地址永远不会相等。
String s1=new String("123");
String s2=new String("123");
out.println(s1==s2);//false
out.println(s1.equals(s2));//true
String s3="134";
String s4="134";
out.println(s3==s4);//true
out.println(s3.equals(s4));//true
String s5=new String("234");
String s6="234";
out.println(s5==s6);//false
out.println(s5.equals(s6));//true
int i1=5;
int i2=5;
out.println(i1==i2);//true
//out.println(i1.equals(i2)); //Cannot invoke equals(int) on the primitive type int
Integer i3=new Integer(5);
out.println(i1==i3);//true;
out.println(i3.equals(i1));//true;
Integer i4=new Integer(5);
out.println(i3==i4);//false;
out.println(i3.equals(i4));//true;
int i6=128;
int i7=128;
out.println(i6==i7);//true
Integer i8=new Integer(128);
out.println(i7==i8);//true
out.println(i8.equals(i7));//true
Integer i9=new Integer(128);
out.println(i8==i9);//false
out.println(i8.equals(i9));//true