对于基本数据类型,比较的是值是否相等;
对于引用类型,比较的是内存地址是否相同;
equals():他的作用也是判断两个对象是否相等,在没有被重写的情况下,equals等效于"=="。
注*:equals()属于Object类
举个栗子:public class Test{ public static void main(String[] args){ String a = new String("奥里给!"); String b = new String("奥里给!"); System.out.println(a == b); System.out.println(a.equals(b)); } }
看看结果:
有的小伙伴可能就会问了,卧槽,你不是说两个等效的吗,为什么返回结果不一样???
解析:
这里a和b都是String类型,引用类型比较的是内存地址,new关键字使用后其实是在堆中创建了两个"奥里给!"对象,所以他们的内存地址是不同的,这个时候使用"=="判断会返回false。
而这里的equals()方法则是在String类中被重写过后的方法,感兴趣的小伙伴可以自行看看源码,大概说起来是这样:方法内部会先使用"=="进行判断,如果返回为false,会将两个字符串的长度进行比较,如果长度相同则会将两个字符串放入两个char[]数组进行数组每一位的比较。(可以理解为先进行"=="判断,如果返回false则进行值的比较),所以使用equals返回为true。
再举个栗子:public class Test{ public static void main(String[] args){ String aa = "奥里给!"; String bb = "奥里给!"; System.out.println(aa == bb); System.out.println(aa.equals(bb)); } }
看看结果:
解析:
这里没有使用new关键字,再创建aa对象时,JVM会在常量池中先寻找是否有相同值,如果没有就 新建一个,如果有就把他赋给当前对象引用。也就是说在这里aa和bb其实引用的是同一个常量,所以这里两个返回都为true。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)