equals与==的区别
马丿克 2019-08-11 01:23:02 1.第一种情况如果对比的是基础类型,那么就只用==比较值,不能用equals方法。
2.第二种情况如果对比的是引用类型,并且引用类型对象没重写equals方法,那么此时调用的方法就是Object中的equals方法,因为Object是所有类的父类。Object的源代码如下,可知此时的equals方法与==并没有区别,比较的都是对象的内存地址。
public boolean equals(Object obj) {
return (this == obj);
}
3.第三种情况如果对比的是引用类型,但是引用类型对象重写了equals方法,或者继承父类中有重写equals方法,则调用自己或者最近一级父类的equals方法。此时equals比较需看它是如何重写的,==还是比较对象的内存地址。
4.第四种情况在Java中String就重写了equals方法,重写后的equals方法比较的是值。此时equals比较的就是对象的值,==比较还是对象的内存地址。Java中常见的重写还有Integer、Byte、Float等。
5.String类型在常量式创建比较String类型有两种创建方法,以下比较结果可发现一个问题,在常量式创建时,内存地址的比较结果为true。常量式字符串,字符串是存在字符串常量区,再创建下一个对象时,就会去字符串常量区寻找有没相同的对象,有就直接引用,所以==比较内存地址时结果也为true,他们引用了字符串的同一个常量。对象式创建与其他引用类型对象一样,对象放堆中,地址放栈中,新的对象有新地址,所以==的结果为false。
//常量式创建比较
String t1 = "str";
String t2 = "str";Boolean b3 = t1.equals(t2);
//结果为ture 比较值
Boolean b4 = t1==t2?true:false;
//结果为true 比较内存地址
//对象创建式比较
String s1 = new String("str");
String s2 = new String("str");
Boolean b1 = s1.equals(s2);
//结果为ture 比较值
Boolean b2 = s1==s2?true:false;
//结果为false 比较内存地址
//混合式比较
Boolean b5 = t1.equals(s1);
//结果为ture 比较值
Boolean b6 = t1==s1?true:false;
//结果为false 比较内存地址
6.总结因为最初equals设计的目的就是用来比较对象值的,只是设计者无法确定具体类如何进行比较,所以默认比较内存地址。在开发过程中,很多时候就需要自己重写equals方法,达到自己比较的目的。