String的常见面试题

1.String可以被继承吗?如果不可以,请说出原因。

不可以,String类被final关键字修饰。final关键字修饰的类不可以被继承,final修饰的方法不可以重写(覆盖),final修饰的属性不可以改变。这里多说一句,final修饰的属性如果是基本数据类型,那么值不能改变;如果修饰的是引用数据类型,那么引用(指针)不能改变。

2.String,StringBuffer和StringBuilder的区别。

String是字符串常量,创建之后不可以修改;StringBuffer和StringBuilder是字符串变量,创建之后可以修改。所以拼接字符串较多的场景下应该尽量使用Buffer和Builder,因为String更耗费内存。StringBuffer和StringBUilder的区别主要是线程是否安全,前者线程安全,效率低下;后者线程不安全,效率较高。二者的方法基本一样,不过Buffer的方法有synchronized关键字修饰。如果不考虑线程安全的问题,建议使用Builder。

3.String直接赋值和构造器创建对象的区别。

直接赋值更节约内存。首先去常量池寻找是否有该字符串,如果有,直接引用,如果没有,先在常量池创建该对象,然后再进行引用;构造器创建对象,直接去堆内存中创建该对象,然后进行引用,同时也会在常量池中创建对象,如果再new一个相同内容的字符串,那么会再次在堆内存中进行创建,而常量池不会再去创建,也就是说每次都会新创建对象,至少进行一次,所以会耗费一些内存。

4.String s1=null;和String s2=" ";的区别。

前者是空对象,声明并进行初始化,但是引用没有进行指向,也没有申请内存资源。本质上不是字符串,所以调用字符串的方法会出现空指针异常;后者是空字符串,存在常量池中,可以调用字符串的方法。

5.判断String的内容是否相等用什么方法?双等为什么不行?

equals方法。重写了父类object的equals方法,又添加了几种情况。父类的equals方法对两个对象进行比较,如果是同一个对象返回true。String的equals方法在此基础上考虑了对象是否是字符串类型,如果是,先比较length,长度相同则比较每个字符,毕竟是char数组,每个字符都相同则返回true,否则返回false。如果length不同直接或者不是String类型那么直接返回false。

双等用于比较对象是否相同,因为String是引用类型,所以比较的是引用,如果是构造器创建的两个相同内容的对象,它返回的也是false。不适用该场景。

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;
}

6.请列举一些String的方法。

length() 查看长度

hashCode() 查看哈希码

equals() 判断内容是否相等

split() 根据字符进行分割

idnexOf() 查看字符第一次出现的位置

concat() 拼接字符串到尾部

charAt() 返回字符出现的位置

replace() 替换字符

compareTo() 按数据字典的顺序进行比较

这里非常感谢“直系学长”的指导和“璐兄”的校对,有问题欢迎来喷!有则改之,无则加勉。

发布了26 篇原创文章 · 获赞 3 · 访问量 3879
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章