“==”运算符与equals方法的区别

来源:互联网 发布:质量数据统计分析表 编辑:程序博客网 时间:2024/05/11 15:12

一. “==”运算符:对于基本数据类型,比较的是值是否相等;对于引用类型,比较的是引用地址是否相同。

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方法的常规协定,该协定声明相等对象必须具有相等的哈希码。