Java学习笔记(十一)--equals与==的区别

前言

equals和==的区别如果不清楚,则很有可能会混用,导致犯一些低级的错误。equals和==在不同类型中的比较是有差别的。想要弄明白,最好先了解一下基本类型和包装类型https://blog.csdn.net/zh15732621679/article/details/78483742

equals

  • 一般情况:equals比较的是对象型的,equals方法是可以被重写的,一般如果没有重写时,源码如下,比较的是对象的引用。
 public boolean equals(Object obj) {
        return (this == obj);
    }
  • JDK自己的包装类型有自己的实现方式,拿Boolean类型和String类型为例:

   Boolean类型的包装类重写了equals方法,比较的是值类型是否相同:

public boolean equals(Object obj) {
        if (obj instanceof Boolean) {
            return value == ((Boolean)obj).booleanValue();
        }
        return false;
    }

举个例子:

Boolean flag = new Boolean(false);
Boolean flag2 = new Boolean(false);

//输出结果为true
System.out.println(flag.equals(flag2));

堆栈情况:


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 hello = new String("hello");
String hello1 = new String("hello");
/输出结果为true
System.out.println(hello.equals(hello1));

==

  • ==比较的是基本类型的数值,当Object类型的进行比较时,比较的是两个对象的引用地址(同一般的对象进行equals比较,当equals进行了重写就不同了)。
String hello = new String("hello");
String hello1 = new String("hello");
//重写了,比较的是值,输出结果为true
System.out.println(hello.equals(hello1));
//比较的是引用地址,输出结果为false
System.out.println(hello == hello1);
//比较基本类型的值
int age = 10;
int age2 = 10;
//输出为true
System.out.println(age == age2);

这样讲会不会矛盾呢?例如两个包装类型String变量,使用==比较时比较的是引用地址,为什么结果为true呢?

String test1 = "hello";
String test2 = "hello";
//输出结果为true
System.out.println(test1 == test2);

因为String类型等号右侧如果是常量,则在堆栈中的位置是常量区,一旦放入常量区,第二个String类型的就会先找常量区中是否已经存在,若已经存在则不会放入第二个变量,所以两个变量用的而是同一个常量,地址相同。

总结

  • equals是在对象型之间进行比较
  • ==比较的是基本类型的值,当在引用类型中比较时比较的是引用地址
  • equals在jdk自带的一些类,如包装类,是重写了equals方法,所以比较方法特殊

猜你喜欢

转载自blog.csdn.net/zh15732621679/article/details/79713846
今日推荐