你真的了解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,直接內存復制。

面試的時候,如果能對一些方法有自己的認識,看過底層源碼,對於面試官來說會有比較深刻的印象!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM