詳解Java中String,StringBuffer和StringBuilder的使用

1.String類

字符串廣泛應用 在 Java 編程中,在 Java 中字符串屬於對象,Java 提供瞭 String 類來創建和操作字符串。

String對象實現瞭Serializable接口,說明String對象可以串行化(在網絡中進行傳輸),同時實現瞭Comparable接口,說明String對象可以進行比較

String是個final類,這代表它是不可被繼承的

String的本質依然是char數組(或者byte數組,要看JDK的版本),通過源碼我們可以輕松的得知:

// JDK1.9及之後的版本,String的字符串內容保存在一個叫做value的byte數組中
@Stable
private final byte[] value;
// 註意這裡的value數組是一個final類型,這代表它是不可以被修改的,這裡指的是value的地址不能發生修改,而並非value數組裡的值

jdk1.8及以前String使用的是char數組,jdk1.9及以後使用的是byte數組。

因為開發人員發現人們使用的字符串值是拉丁字符居多而之前使用的char數組每一個char占用兩個字節而拉丁字符隻需要一個字節就可以存儲,剩下的一個字節就浪費瞭,造成內存的浪費,gc的更加頻繁。因此在jdk9中將String底層的實現改為瞭byte數組。

2.String對象創建的兩種方式

// 直接賦值
String name = "dahe";
System.out.println(name);
// 調用構造器賦值
String wodeshijie = new String("wodeshijie");
System.out.println(wodeshijie);

兩種對象創建方式的區別:

直接賦值:現在常量池中看是否存在該字符串,存在則直接指向,不存在則創建後指向

new的方式:先在堆中新建一個對象空間,通過value數組在常量池中尋找該字符串,有的話就將地址返回給value,沒有的話就先創建再將地址返回給value

經典面試題A:

會創建一個對象,編譯器會對該代碼進行優化,a存儲的字符串等價於helloabc

經典面試題B:(該代碼塊創建幾個對象)

// 面試題
String a = "hello";
String b = "world";
String c = a + b;

會創建三個對象,a對象和b對象,c對象的創建其實是在堆中,堆中的地址指向字符串常量池的一個helloworld對象常量相加看的是池,變量相加是在堆中!

3.String常用方法

直接上代碼演示:

/**
 * String練習
 */
public class StringTest {
    public static void main(String[] args) {
        // 直接賦值
        String name = "dahe";
        System.out.println(name);
        // 調用構造器賦值
        String wodeshijie = new String("wodeshijie");
        System.out.println(wodeshijie);

        // String類的常用方法
        String a = "imustctf";
        String b = "Imustctf";
        // 判斷兩字符串的值是否相等(區分大小寫)
        System.out.println(a.equals(b));
        // 判斷兩字符串的值是否相等不區分大小寫)
        System.out.println(a.equalsIgnoreCase(b));
        // 獲取字符個數
        System.out.println(a.length());
        // 獲取子字符串在字符串對象中第一次出現的索引位置,找不到返回-1
        int index = a.indexOf('m');
        System.out.println(index);
        // 獲取子字符串在字符串對象中最後一次出現的索引位置,找不到返回-1
        int lastIndex = a.lastIndexOf('t');
        System.out.println(lastIndex);
        // 字符串截取
        System.out.println(a.substring(2)); // 截取2後面的所有字符
        System.out.println(a.substring(2, 5)); // 截取0 - 4的所有字符
        // 字符串轉大寫
        System.out.println(a.toUpperCase());
        // 字符串轉小寫
        System.out.println(b.toLowerCase());
        // 字符串拼接
        String c = "begin";
        c = c.concat(a).concat(b);
        System.out.println(c);
        // 替換
        c = c.replace("begin", "end");
        System.out.println(c);
        // 分割字符串
        String 春日山中對雪 = "竹樹無聲或有聲,霏霏漠漠散還凝," +
                "嶺梅謝後重妝蕊,巖水鋪來卻結冰," +
                "牢系鹿兒防獵客,滿添茶鼎候吟僧," +
                "好將膏雨同功力,松徑莓苔又一層";
        String[] splitRes = 春日山中對雪.split(",");
        for (String splitRe : splitRes) {
            System.out.println(splitRe);
        }
        // 字符串轉化為字符數組
        char[] chs = a.toCharArray();
        for (char ch : chs) {
            System.out.println(ch);
        }
        // 字符串比較,前者大返回正數,後者大返回負數,相等返回0
        System.out.println("abcd".compareTo("abcz"));
        // 字符串格式化
        String info = String.format("網站名字%s,首字母大寫後%s", a, b);
        System.out.println(info);
    }
}

輸出:

false
true
8
1
6
ustctf
ust
IMUSTCTF
imustctf
beginimustctfImustctf
endimustctfImustctf
竹樹無聲或有聲
霏霏漠漠散還凝
嶺梅謝後重妝蕊
巖水鋪來卻結冰
牢系鹿兒防獵客
滿添茶鼎候吟僧
好將膏雨同功力
松徑莓苔又一層
i
m
u
s
t
c
t
f
-22
網站名字imustctf,首字母大寫後Imustctf

4.StringBuffer

概述

當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。

和 String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,並且不產生新的未使用對象。

在使用 StringBuffer 類時,每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,所以如果需要對字符串進行修改推薦使用 StringBuffer。

StringBuffer的本質依然是char數組(或者byte數組,要看JDK的版本)但是和String不同的是,該數組不是final類型的和String類一樣,StringBuffer類也是final類型,代表它不能被繼承!

String VS StringBuffer:

StringBuffer三種構造器初始化

// 創建一個大小為16的char[] 數組,用於存放字符內容
StringBuffer stringBuffer = new StringBuffer();
// 指定char[]容量大小
StringBuffer stringBuffer1 = new StringBuffer(100);
// 通過給一個string創建stringbuffer,初始容量為字符串長度 + 16
StringBuffer dahezhiquan = new StringBuffer("dahezhiquan");

String和StringBuffer的轉換

String –> StringBuffer

// String --> StringBuffer
String str = "hello";
// 方法一:通過構造器
StringBuffer stringBuffer2 = new StringBuffer(str);
// 方法二:通過append
StringBuffer stringBuffer3 = new StringBuffer();
stringBuffer3.append(str);

StringBuffer –> String

// StringBuffer --> String
StringBuffer stringBuffer4 = new StringBuffer("lsp");
// 方法一:通過toString方法
String s = stringBuffer4.toString();
// 方法二:使用構造器
String s1 = new String(stringBuffer4);

StringBuffer的常用方法

代碼示例:

// StringBuffer的常用方法
StringBuffer imustctf = new StringBuffer("imustctf");
// 追加操作
imustctf.append(" nice");
imustctf.append(" yes").append(true).append(5.21).append(1314);
System.out.println(imustctf);
// 刪除操作
// 刪除索引為5到6的字符
imustctf.delete(5,7);
System.out.println(imustctf);
// 修改操作,替換9到10的字符為方文傑
imustctf.replace(9,11,"方文傑");
System.out.println(imustctf);
// 查找操作
int index = imustctf.indexOf("方文傑");
System.out.println(index);
// 插入操作,在索引為9的後面插入張三
imustctf.insert(9,"張三");
System.out.println(imustctf);
// 長度
System.out.println(imustctf.length());

輸出:

imustctf nice yestrue5.211314
imustf nice yestrue5.211314
imustf ni方文傑 yestrue5.211314
9
imustf ni張三方文傑 yestrue5.211314
30

5.StringBuilder

概述

一個可變的字符序列,此類提供一個與StringBuffer兼容的API,但不保證同步(不是線程安全的),用在字符串緩沖區被單個線程使用的時候,如果可能建議優先使用該類,因為在大多數的時候,它比StringBuffer要快

StringBuilder類是final類型,不能被繼承!StringBuilder的本質依然是char數組(或者byte數組,要看JDK的版本),該數組不是final類型

StringBuilder和StringBuffer同屬一個父類,故他們的方法一致

現在我們來看一下String,StringBuffer,StringBuilder的區別:

到此這篇關於詳解Java中String,StringBuffer和StringBuilder的使用的文章就介紹到這瞭,更多相關Java String內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: