学了这一段时间的Java语言,对Java中的基础语法也有了一定的了解,这次来说一下==和equals的区别。
相信学过Java的人都知道,我们一直说的是:==比较的是地址,而equals比较的是内容,这次就来具体看看。
public class Demo{
public static void main(String[] args) {
// == 永远比的是地址
Integer i1 = 3; //new Integer(3) 自动装箱
Integer i2 = 3; //new Integer(3) 自动装箱
//这里i1 和 i2 指向的是同一个对象!
System.out.println(i1==i2); //true
//自动拆箱 i1.intValue()+i2.intValue()
System.out.println(i1+i2); //6 用的是值
//自动拆箱 i1.intValue()<i2.intValue()
System.out.println(i1<i2); //false 用的还是值
System.out.println(i1.equals(i2)); //true 比的是内容
System.out.println("====================");
//注意在自动装箱的时候,如果值在byte范围内 -128~127 常用数据范围
//尽量避免创建冗余的对象,那么此时会对这些对象进行复用,
//如果超出byte范围 那么就得重新创建对象了。
Integer i3=200; //new Integer(200)
Integer i4=200; //new Integer(200)
//i3 和 i4 是两个对象!
System.out.println(i3==i4); //false
System.out.println(i3+i4); //400 200+200 自动拆箱intValue
System.out.println(i3<i4); //false 200<200 自动拆箱intValue
System.out.println(i3.equals(i4));//true
}
}
通过上面这个例子,相信大家都能明白==和equals比较的区别。
然后我们来看一下String类里面的equals方法:
public boolean equals(Object anObject) {
//先对传进来的参数做一个判断
//看传进来的对象是否和当前对象是否是同一个对象
//即是否指向堆内存中同一个空间地址,如果是则返回true
if (this == anObject) {
return true;
}
//接着再判断传进来的参数对象是否属于本类的对象
//如果属于将其对象的引用类型进行强制类型的转换
if (anObject instanceof String) {
String anotherString = (String)anObject;
//再对两者进行长度的判断
int n = value.length;
if (n == anotherString.value.length) {
//再进行该对象所指向堆中所创建的地址里面所指向的内容进行逐一判断
//如果全部相等则返回true
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;
}
String类里面的equals方法是重写了它的父类Object里面的equals方法,所以最后比的还是内容。