String和StringBuilder中equals方法
2023.3.8
先来一道面试题:
Q:请问最下面两行运行结果是什么,为什么?
A:运行结果都为false。
String s="abc";
这行代码首先会在常量池中创建“abc”
常量,然后将其在常量池中的地址赋值给字符串常量s
;StringBuilder sb=new StringBuilder("abc");
这行代码首先会在常量池中查找是否有“abc”
常量,如果有则直接引用,如果没有则创建“abc”
常量后再引用。然后调用StringBuilder中的单参构造方法创建一个对象,并将其在堆中的地址赋值给StringBulider对象sb
;- 在jdk8中,
equals()
方法源自于Object类中,其作用是将两个对象的地址
进行比较。
但是String类中重写了equals()
方法,使其比较的是字符串
内容。
而StringBuilder中并没有重写equals()
方法,所以StringBuilder对象调用equals方法依旧用的是Object类的equals方法,即比较地址。 s.equals(sb);
这行代码是String对象调用equals方法,虽然重写后比较内容,但是在重写的方法中对equals方法传入的对象进行了一次判定:当传入对象为String类型时才会比较,否则直接返回false。因为sb对象为StringBuilder对象而非String对象,所以这行代码放回falsesb.equals(s);
这行代码是StringBuilder对象调用equals方法,因为比较地址,所以放回false。