java .equals()和==的区别
(1)比较基本数据类型
对于8种基本数据类型的变量,变量直接存储的是“值”,因此在用关系操作符==来进行比较时,比较的就是 “值” 本身。
(2)比较包装类
public class Main {
public static void main(String[] args) {
Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
System.out.println(i1 == i2);//false
System.out.println(i1.equals(i2));//true
}
}
这里"=="比较的是变量指向的内存地址,new产生的两个不同的对象所存放的地址是不一样的,这边的"equals"比较的就是内容,这里为什么比较的是内容,因为Integer重写了equals的方法。附上源码:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer) obj).intValue();
}
return false;
}
(3)比较String
"=="比较的是内存地址,"equals"比较的是值,String重写了equals方法。源码:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof 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; }
(4)比较对象
public class Main { public static void main(String[] args) { Test t1 = new Test(); Test t2 = new Test(); System.out.println(t1 == t2);//false System.out.println(t1.equals(t2));//false } }
没有重写equals方法的类都是调用Object的equals方法:
public boolean equals(Object obj) { return (this == obj); }