你真的了解String的常见API吗?

Posted 山河永慕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你真的了解String的常见API吗?相关的知识,希望对你有一定的参考价值。

面试官Q1:请问String常见的方法有哪些,列举几个?

String是我们开发中使用频率最高的类,它有哪些方法,大家一定不会陌生,例如:

  • length();//计算字符串的长度

  • charAt();//截取一个字符

  • getChars();//截取多个字符

  • equals();//比较两个字符串

  • equalsIgnoreCase();//比较两个字符串,忽略大小写

  • startsWith();//startsWith()方法决定是否以特定字符串开始

  • endWith();//方法决定是否以特定字符串结束

  • indexOf();//查找字符或者子串第一次出现的地方。

  • lastIndexOf();//查找字符或者子串是后一次出现的地方。

  • substring();//截取字符串

  • concat();//连接两个字符串

  • replace();//替换

  • trim();//去掉起始和结尾的空格

  • valueOf();//转换为字符串

  • toLowerCase();//转换为小写

  • toUpperCase();// 转换为大写

但是像replace(),substring(),toLowerCase()这三个方法需要注意一下,我们看下下面一段代码:

import java.util.*;
public class StringTest {
     public static void main(String[] args){
      String ss = "123456";
      System.out.println("ss = " + ss);
      ss.replace(‘1‘, ‘0‘);
      System.out.println("ss = " + ss);
      }
}

打印结果:

ss = 123456
ss = 123456

如果你不了解replace方法的源码,可能会认为最后的打印结果为 "ss = 023456",但是实际上方法内部创建了一个新的String对象,并将这个新的String对象返回。对ss是没有做任何操作的,我们也知道String是不可变的嘛。源码如下:

public String replace(char oldChar, char newChar) {
    // 判断替换字符和被替换字符是否相同
    if (oldChar != newChar) {
        int len = value.length;
        int i = -1;
        // 将源字符串转换为字符数组
        char[] val = value; /* avoid getfield opcode */
        while (++i < len) {
           // 判断第一次被替换字符串出现的位置
            if (val[i] == oldChar) {
                break;
            }
        }
        // 从出现被替换字符位置没有大于源字符串长度
        if (i < len) {
            char buf[] = new char[len];
            for (int j = 0; j < i; j++) {
                // 将源字符串,从出现被替换字符位置前的字符将其存放到字符串数组中
                buf[j] = val[j];
            }
            while (i < len) {
                char c = val[i];
                // 开始进行比较;如果相同的字符串替换,如果不相同按原字符串
                buf[i] = (c == oldChar) ? newChar : c;
                i++;
            }
            // 使用String的构造方法进行重新创建String
            return new String(buf, true);
        }
    }
    return this;
}

方法内部最后重新创建新的String对象,并且返回这个新的对象,原来的对象是不会被改变的。substring(),toLowerCase()方法也是如此。

 

还有诸如contact()方法,源码如下:

public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    int len = value.length;
    char buf[] = Arrays.copyOf(value, len + otherLen);
    str.getChars(buf, len);
    return new String(buf, true);
}

从上可知参数str不能为null,否则就会包空指针异常。用contact()拼接字符串速度也很快,因为直接Arrays.copyOf,直接内存复制。

面试的时候,如果能对一些方法有自己的认识,看过底层源码,对于面试官来说会有比较深刻的印象!

以上是关于你真的了解String的常见API吗?的主要内容,如果未能解决你的问题,请参考以下文章

toString()String.valueOf(String)强转,如何抉择,你真的了解吗?小白必看,面试必考

SQL注入你真的了解吗?

你真的了解http,https吗?万字长文带你深入了解http!

你真的了解http,https吗?万字长文带你深入了解http!

#yyds干货盘点#关于 Java 的可变参数你真的了解吗?

04-字典集合,你真的了解吗