面试String的特点及重要方法

大家好,最近呢本人也是在面试,顺便记录一些让我们如何拿到高薪offer的经验和技巧,在我个人觉得,想要面试官对你满意,那就是关于一个问题,你能举一反三甚至往更多,这就要求我们必须对源码的掌握,你对源码掌握的深度,才能更明显的体现你到底是不是货真价实,我只是做一些整理,希望能够帮到需要的人。

几乎所有的Java面试,都是String开始的,第一印象非常重要,所以对于String的知识,我们必须深入的掌握才能为自己赢得更多的筹码

1.String是如何实现的?

以主流的JDK1.8来说,String的内部存储结构为char数组 ,源码如下:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    //用于存储字符串的值
    private final char value[];
    //缓存字符串的hash code
    private int hash; // Default to 0
    //其他内容
    }

2.String常用有哪些构造方法?

①以String为参数的构造方法

public String(String original) {
    this.value = original.value;
    this.hash = original.hash;
}

②以char[]为参数的构造方法

public String(char value[]) {
    this.value = Arrays.copyOf(value, value.length);
}

③以StringBuffer为参数的构造方法

public String(StringBuffer buffer) {
    synchronized(buffer) {
        this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
    }
}

④以StringBiulder的构造方法

public String(StringBuilder builder) {
    this.value = Arrays.copyOf(builder.getValue(), builder.length());
}

其中我们比较忽略的是StringBuffer和StringBuilder为参数构造方法,因为三种数据类型,我们通常都是单独使用,所以我们要注意一下这里。

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

String类型重写了Object中的equals()方法,equals()方法需要传递一个Object类型的参数值,在比较时会先通过instanceof判断是否为String类型,如果不是的话则会直接返回false,当判断参数为String类型之后,会循环对比两个字符串中的每个字符,当都一样时返回true,否则返回false。
还有一个比较类似的方法equalslgnoreCase(),他是用来忽略字符串大小写之后进行对比的。

3.compareTo比较两个字符串

我们看源码:

public int compareTo(String anotherString) {
    int len1 = value.length;
    int len2 = anotherString.value.length;
    int lim = Math.min(len1, len2);
    char v1[] = value;
    char v2[] = anotherString.value;

    int k = 0;
    while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    return len1 - len2;
}

可以看出,compareTo()方法会循环对比所有的字符,当两个字符中有任意一个字符不同时,则return char1-char2。
比如两个字符串分别存储的是1和2,返回值是-1,如果存储是1和1,则返回0,如果是2和1,则返回1。

还有一个类似的方法是compareTolgnoreCase(),用于忽略大小写比较。

小结:
可以看出上面两个方法都用于比较字符串,但他们的不同点:

  • equals()可以接收一个Object类型的参数,而compareTo()只能接收String的参数;
  • equals()返回值为Boolean,而compareTo返回int;

他们都用于字符串比较,当equals返回true或者compareTo返回0时,则表示字符串完全相同。

4.其他重要方法

  • indexOf():查询字符串首次出现的下标位置
  • lasIndexOf():查询字符串最后出现的下标位置
  • contains():查询字符串中是否包含另一个字符串
  • toLowerCase():把字符串全部转换为小写
  • toUpperCase():把字符串全部转换为大写
  • length():查询字符串长度
  • trim():去掉字符串首尾空格
  • replace():替换字符串中某些字符
  • split():把字符串分割并且返回数组
  • join():把字符串数组转换为字符串

总结:String源码属于Java源码中最基础最基本的源码,你对Java源码的理解,侧面可以反应了你是否热爱和喜欢专研程序,也反应了你的Java功底,String的问题如果在延伸一下,会有更多的细节,通常关联一下问题:

  • 为什么String用final修饰
  • ==和equals的区别
  • String,StringBuffer,StringBuilder的区别
  • String的intern()的真正含义
  • String类型在JVM(Java虚拟机)中如何存储,编译器对String做了哪些优化

带着这些问题,我们下期再烂看看这些知识点的真正答案,我们,下期再会!

发布了8 篇原创文章 · 获赞 16 · 访问量 252

猜你喜欢

转载自blog.csdn.net/weixin_44740789/article/details/104874882
今日推荐