1、==
(1)基本数据类型比较的是值是否相等
(2)引用类型比较的是地址是否相等
package sun;
public class Test {
public static void main(String[] args) {
int a=2;
int b=3;
System.out.println(a==b);//基本数据类型
String str1="Lucy";
String str2="Lucy";
System.out.println(str1==str2);//引用类型
}
}
结果:
2、equals
(1)Object类中的equals方法比较的是地址是否相等
Object类的equals方法的源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
(2)String类中重写了equals方法,String类中equals方法比较的是内容是否相等
例如:
package sun;
public class Test {
public static void main(String[] args) {
String name1="Tim";
String name2="Tim";
System.out.println(name1.equals(name2));//执行到第一步,返回true
Test test = new Test();
System.out.println(name1.equals(test));//执行到第二步,返回false
String name3=new String ("Tom");
System.out.println(name1.equals(name3));//执行到第三步,返回true
}
}
String类的equals方法的源码如下:
public boolean equals(Object anObject) {
if (this == anObject) { //第一步:比较调用这个equals方法的字符串和传给这个方法的参数(另一个字符串)的地址是否相等
return true;
}
if (anObject instanceof String) {//第二步:判断传给这个方法的参数的类型是否是String型,是的话才进入下一步,否则直接返回false
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;//如果每个都相等,返回true
}
}
return false;
}