Java基础-equals与"=="
在编程过程中,我们经常会遇到判断是否相等的问题,那么就会用到equals和"=="
Demo
public class Demo {
public static void main(String[] args) {
String s1 = "zhongyp";
String s2 = "zhongyp";
String s3 = new String("zhongyp");
String s4 = new String("zhongyp");
String s5 = new String("zhongyp").intern();//下文将有解释
int a = 1;
int b = 1;
System.out.println(s1 == s2);// true
System.out.println(s1.equals(s2));// true
System.out.println(s3 == s4);// false
System.out.println(s3.equals(s4));// true
System.out.println(s1 == s5);// true
System.out.println(s1.equals(s5));// true
System.out.println(a == b);// true
}
}
程序在运行的时候会创建一个字符串缓冲池,在String s1=“zhongyp”;时,"zhongyp"被放到字符串缓冲池,当String s2=“zhongyp”;时,程序首先会在字符串缓冲池内相同值的对象,所以当s2被创建时,程序找到了s1,将s2引用s1所引用的对象,即s2=s1;
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。所以s5调用的同样是s1的对象,即s5=s1;
在描述equals与= =关系之前,我们应该先了解Java的8种基本数据类型
浮点型:float(单精度浮点型), double(双精度浮点型)
整型:byte(字节型), short(短整型), int(整型) , long(长整型)
字符型: char(字符型)
布尔型: boolean(布尔类型)
基本数据类型的变量直接存储的是“值”,因此在比较基本数据类型时比较的是“值”的本身,使用 = =去比较;
而对于非基本数据类型的变量,非基本数据类型的变量存储的并不是 “值”本身,而是于其关联的对象在内存中的地址。
而equals比较的是什么呢?我们可以去到jdk目录下的src.zip,解压后的src\java\lang\Object.java
public boolean equals(Object obj) {
return (this == obj);
}
可以看出在Object.java的equals中比较的是两个对象是否一致;
当然这只是Object.java中equals的方法,我们应该去Sting.java,因为我们上面用到的非基本数据类型就是String类型(Sting.java在同一目录下)
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;
}
我们可以看出,String类中equals方法是重写了Object类中的equals方法,首先是比较对象是否一致,一致直接返回true,否则继续判断两个字符串的内容是否一致。
小结
对于==
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于非基本数据类型的变量,则比较的是其关联的对象在内存中的地址是否相等。
对于equals
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
若对equals方法进行了重写的话,比较的是所指向的对象的内容,如String类中的equals方法。
注意:equals方法不能作用于基本数据类型的变量,基本数据类型的变量比较只能用==去比较。