equals和==的区别
equals
:是判断两个变量或实例所指向的内存空间的值是不是相同,是一个方法。==
:判断两个变量或实例是不是指向同一个内存空间。,是一个运算符合。
运用场景
- 8大基本数据类型,比较他们的值,用双等于
==
,byte、short、char、int、long、float、double、boolean。 - 复合数据类型
(a)==
:比较内存中的存放地址,两个new出来的对象比较肯定是false
(b)equals
:
Object类equals方法源码:比较的是地址,等价于==
public boolean equals(Object obj) {
//比较的是地址
return (this == obj);
}
我们直到Object类是所有类的父类,子类是可以重写父类的equals方法:例如String类、Integer等
String源码:
public boolean equals(Object anObject) {
//同一个对象返回true
if (this == anObject) {
return true;
}
//值相等返回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;
}
例子1:
@Test
public void Test() {
String str1 = "yes";
String str2 = "yes";
System.out.println(str1.equals(str2));
System.out.println(str1==str2);
}
结果都是true,这是因为程序在运行的时候会创建一个字符串缓冲池,str1先被放到了池中,str2被创建的时候,程序找到了具有相同值的str1,会将str2引用str1所引用的对象,指向同一个对象,==
自然为true。
例子2:
@Test
public void Test() {
String str1 = "yes";
String str2 = new String ("yes");
System.out.println(str1.equals(str2));
System.out.println(str1==str2);
}
结果true false,equals方法走的源码中的第二个if,比对值,值相同,返回true。str2是new出来的对象,str1和str2的地址肯定是不同的。