先抛个问题

int i = 0;
double d = 0d;
Integer integer = 0;
Double dDouble = 0d;

String str = "test";
StringBuilder sb = new StringBuilder("test");

Student student1 = new Student();
Student student2 = new Student();


// 以下打印的是false还是true
System.out.print(i == d);
System.out.print(dDouble.equals(integer));

System.out.print(str == sb.toString());
System.out.print(str.equals(sb.toString()));

System.out.print(student1 == student2);

看完下面的解析,我想以上问题能轻松回答上来。。。

 

1、“==”

“==”在我们的意识中,它代表着相等,等价于。在Java中,它有两种含义,在比较基本类型时,比较的就是值;而在比较引用类型时,比较的是引用的地址。

所以

int i = 0;
double d = 0;

// 输出结果为true
System.out.print(i == d);
Student student1 = new Student();
Student student2 = new Student();

// 输出结果为false
System.out.print(student1 == student2);

 

2、equals

首先,先看Object中定义的equals方法,源码如下:

public boolean equals(Object obj) {
        return (this == obj);
}    

从上面可以看出,Object的equals方法比较的是两个对象的引用地址是否一致,但很多时候我们的需求是比较两个对象的值是不是一样,于是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;
    }        

其实,基本类型的包装类型,如Integer、Double等都重写了equals方法,下面可以看下Integer重写equals方法的源码

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        // 若为Integer类型,比较两者的值
        return value == ((Integer)obj).intValue();
    }
    return false;
}    

所以

String str = "test";
StringBuilder sb = new StringBuilder("test");

// 结果是false,StringBuilder的toString()会新生成一个String 
System.out.print(str == sb.toString());
// 结果是true,每个字符的值是一样的
System.out.print(str.equals(sb.toString()));
Integer integer = 0;
Double dDouble = 0d;

// d的类型是Double,结合Integer的equals方法的源码,马上知道结果是false
System.out.print(integer.equals(dDouble));

 

看完了以上内容,是不是对==和equals有了不一样的理解呢?

1、对于基本类型,“==”比较值是不是相等;

2、对于Object,比较的是对象的引用地址是不是一样;

3、对于基本类型的包装类型,重写了Object中的equals,比较的是类型和值是不是都一样;

4、对于字符串,重写了Object中的equals,比较每个字符的值是不是一样。

 

希望能帮到大家。。。

 

posted on 2020-05-04 15:14  呵呵静  阅读(224)  评论(0编辑  收藏  举报