1. ==:可以比较基本数据类型和引用数据类型
概述:
既可以比较基本数据类型;
也可以比较引用数据类型。
1. 比较基本类型,比较值的大小:
int i = 3;
int j = 3;
System.out.println(i == j);
return:true.
2. 比较引用类型,比较对象的引用地址:
String str = "haha";
String str1 = "haha";
String str2 = new String("haha");
System.out.println(str == str1);
return: true.
System.out.println(str == str2);
return: false.
备注:字符串缓存池中,若已有字符串,则赋值时不再创建一个新的字符串;如果是new关键字则创建一个
新的字符串。
特殊: Integer(值为-128 ~ 127)是创建对象,直接去Integer的缓存中取创建好的对象,不属于这个返回会创建新的Integer对象。
case1:
Integer i = 120;
Integer i2 = 120;
System.out.println(i == i2);
return: true.
case2:
Integer i = 1234;
Integer i2 = 1234;
System.out.println(i == i2);
return: false.
2. equals: 只可以比较引用数据类型
概述:
继承至Object对象的方法;
所有的引用类型都能调用;
只能比较引用数据类型。
1. 比较引用数据类型比较的是引用地址:
People p = new People();
People p2 = new People();
System.out.println(p.equals(p2));
return: false;
特殊:String类、Integer分装类重写了equals()方法,比较的是内容。
Integer i = 10;
Integer i2 = 10;
System.out.println(i.equals(i2));
return: true.
3. 源码分析
3.1 Object类下的equals()方法
public class Object {
// equals()方法底层也是通过==做比较的
public boolean equals(Object obj){
return (this == obj);
}
}
3.2 String类下的equals()方法
public final class String
implements java.io.Serializable,Comparable<String>,CharSequence{
public boolean equals(Object anObject) {
// 通过==判断引用地址是否相同
if(this == anObject){
return true;
}
// 判断anObject是否为String类的一个实例
if(anObject instanceof String){
String anotherString = (String)anObject;
// 获取到String类下value数组的长度
int n = value.length;
// 判断当前String类下value数组的长度和输入的对象的长度是否一致
// 不一致直接返回false
if(n == anotherString.value.length){
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
// 循环遍历,只要两个数组中有一个字符不同就返回false
while(n-- != 0){
if(v1[i] != v2[i])
return false;
i++;
}
}
}
return false;
}
}