1. 概述
《Java编程思想》:关系运算符生成的是一个boolean结果,它们计算的是操作数的值之间的关系。也就是说==只是进行值之间的比较。
2. 从代码示例分析equals()与==
1.关系运算符==的代码示例:
public class Main {
public static void main(String[] args) {
int n=6;
int m=6;
System.out.println(n==m);
String str = new String("hello");
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1==str2);
str1 = str;
str2 = str;
System.out.println(str1==str2);
}
}
输出的结果及解析:
true:对于基本数据类型的m和n存储的值都是常量3,所以相等
false:对于引用类型的str1和str2则保存的是不同对象对应的内存地址值,所以不同
true:此时的str1和str2保存的对象是同一个,故结果为true
综上所述:对于8种基本数据类型的变量,变量直接存储的是“值”,因此用关系操作符==进行比较时,比较的就是值的本身。
补充:
在Java中的8种基本数据类型:
浮点型:float(4 byte), double(8 byte)
整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字符型: char(2 byte)
布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值"true"和"false")
2. equals()代码示例
public class Main {
public static void main(String[] args) {
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2));
}
}
结果:true
解析:首先equals方法是基类Object中的方法,因此只要继承Object的类中都会有该方法,Object类中的equals方法源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
根据上述源码所示,在Object类中equals方法是用来比较两个对象的引用是否相等,及判断是否指向同一个对象,代码示例应该返回的为false,因为equals(Object obj)方法中是直接使用==比较的。
由于比较的类型是String,String中的equals()方法源码如下:
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()方法进行了重写,由此方法可以看出,实际比较的是该引用指向地址中字符串是否相等。实际上诸如Double,Date,Integer等,都对equals()方法进行了重写用来比较指向的对象所存储的内容是否相等。
Integer重写后的equals()
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
3. 总结
1. 对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的所在的内存地址。
2. 对于equals方法,注意:equals方法不能作用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。