又到了招聘旺季,鸭哥的读者中,最近应该有不少小伙伴在准备面试吧。

不管有没有工作经验,基础是否扎实都是面试重点考察的点。正所谓基础不牢,地动山摇,基础知识不仅能反映语言功底,很多知识用法的易踩坑点更是经验教训的总结。

鸭哥也多次参与过面试,如果应聘者既掌握了所问的基础知识,又能说一些知识相关的易踩坑点,在鸭哥这里是很加分的。下面就分享一个面试时令鸭哥印象深刻的回答,这样答完后,平时比较严肃的鸭哥,也不经意间露出了赞赏的笑容~

问题:在 Java 中,我们为什么不用 == 而用 .equals() 比较字符串呢?

Java 中,String 属于引用数据类型。对字符串对象的比较,不能简单地使用比较运算符“==”,因为比较运算符比较的是两个字符串的地址是否相同。即使两个字符串对象的内容相同,只要它们引用的不是同一内容,使用比较运算符依旧会返回false。语言不够直观的话,代码来说话

public class compareString {
    public static void main(String[] args) {
        String s1 = "test";
        String s2 = "test";
        String s3 = s1;                    // 相同引用
        String s4 = new String("test");
        String s5 = new String("test");

        if(s1 == s2 && s2 == s3){
            System.out.println("s1,s2和s3使用比较运算符返回true,因为它们引用的是同一公共池中的同一对象");
        }

        if(!(s4 == s5)){
            System.out.println("s4和s5使用比较运算符返回false,因为它们引用的是不同的对象");
        }

        if(s4 != null && s4.equals(s5)){
            System.out.println("s4与s5引用的不同字符串对象的值相同");
        }
    }
}

在上面的代码中,

遇到字符串常量时,编译器会使用该值创建一个 String 对象,s1, s2, s3 引用的是同一个字符串常量,所以它们的引用地址及引用对象的值都完全相同

                       String Pool
     s1 -----------------> "test" <-----------------s2
     ||
     s3

对于 s4 和 s5,new 时分别创建了两个字符串对象,虽然字符串的内容相同,但是它们的引用地址是不同的

                     Heap
     "test" <-------------------- s4
                   
     "test" <-------------------- s5

所以就有了下面的运行结果:

1.png

能答出上面这些内容,就反映出应聘者的基础是很扎实的。除此之外,实战方面,.equals() 还有一些注意事项如下

当字符串对象为 null 时,调用 .equals() 方法会抛空指针异常

String testStr1 = null;
String testStr2 = new String("test");
boolean result = testStr1.equals(testStr2);   //因为testStr1为null,所以这里将抛出NullPointerException

//正确的写法是,先检查testStr1不为空,再调用.equals() 方法
if(testStr1 != null)
    boolean result = testStr1.equals(testStr2);

当我们想要在忽略大小写的情况下比较两个字符串是否相等时,可以用.equalsIgnoreCase()方法

String testStr3 = new String("abc");
String testStr4 = new String("ABC");
if(testStr3 != null)
System.out.println(testStr3.equalsIgnoreCase(testStr4));   //此时输出比较结果:"true"

这些非必答的内容,答出来是有一定的加分效果的,因为这些内容一定程度上反映了实战经验。但所占篇幅不宜过长,应该把握住面试官提问的主要内容,不然效果可能适得其反。

你有哪些面试技巧呢?欢迎留言补充。

标签: java, 字符串比较, Java面试题, stackoverflow中文版