一. “==”运算符:对于基本数据类型,比较的是值是否相等;对于引用类型,比较的是引用地址是否相同。
1. 基本数据类型以及它们的包装类
例1:
int i = 10;
int j = 10;
if (i == j)
System.out.println("==");
else
System.out.println("!=");结果是: ==
例2:
Integer i = 10;
Integer j = 10;
if (i == j)
System.out.println("==");
else
System.out.println("!=");结果是: ==
2. 引用类型
例3:
EqualsDemo e1 = new EqualsDemo("Fine");
EqualsDemo e2 = new EqualsDemo("Fine");
if (e1 == e2)
System.out.println("==");
else
System.out.println("!=");结果是: !=
为什么是不等呢?因为e1与e2的引用地址不同,它们指向的是两个不同的内存空间。
特别的字符串类型:
例4:
String s1 = new String("Hello");
String s2 = new String("Hello");
if (e1 == e2)
System.out.println("==");
else
System.out.println("!=");结果是: !=
例5:
String s1 = "Hello";
String s2 = "Hello";
if (s1 == s2)
System.out.println("==");
else
System.out.println("!=");结果是: ==
例4是给每一个字符串实实在在地在内存上分配两个不同的堆空间。
例5看起来也是,哪为什么它们相等呢?这是因为JVM为了减少不必要的内存开销,把这两个对象都指向同一个堆里面的地址。
二. equals方法是比较对象内容上是否相等。
例6:
String s1 = "Hello";
String s2 = "Hello";
if (s1.equals(s2))
System.out.println("true");
else
System.out.println("false");结果是: true
例7:
EqualsDemo e1 = new EqualsDemo("Fine");
EqualsDemo e2 = new EqualsDemo("Fine");
if (e1.equals(e2))
System.out.println("true");
else
System.out.println("false");结果是: false
从例6和例7看出它们的结果不一样,为什么呢?因为String类覆盖了Object类上的equals方法,而由于类的继承性,我们定义的类也可以使用Object类的equals方法,可是我们并没有覆盖它,所以返回值总是为false,比较结果就不一定准确。因此,我们在自定义类中必须覆盖Object类的equals方法。
例7的完整代码如下:
public class EqualsDemo {
private String name;public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public EqualsDemo(String name) {
this.name = name;
}public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}public boolean equals(Object obj) {
if (obj == null)
return false;
if (obj == this)
return true;
if (!(obj instanceof EqualsDemo))
return false;
EqualsDemo eq = (EqualsDemo) obj;
if (eq.name.equals(name))
return true;
return false;
}public static void main(String[] args) {
EqualsDemo e1 = new EqualsDemo("Fine");
EqualsDemo e2 = new EqualsDemo("Fine");
if (e1.equals(e2))
System.out.println("true");
else
System.out.println("false");
}
}结果是: true
注意: 重写equals方法时,,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,该协定声明相等对象必须具有相等的哈希码。