前言
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方法,所以比较方法特殊