欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2022年07月20日 14:17:06   作者:世界盡頭與你  
這篇文章主要為大家詳細介紹了Java中String,StringBuffer和StringBuilder三者的區(qū)別以及使用,文中的少了講解詳細,感興趣的可以了解一下

1.String類

字符串廣泛應用 在 Java 編程中,在 Java 中字符串屬于對象,Java 提供了 String 類來創(chuàng)建和操作字符串。

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

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

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

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

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

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

2.String對象創(chuàng)建的兩種方式

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

兩種對象創(chuàng)建方式的區(qū)別:

直接賦值:現在常量池中看是否存在該字符串,存在則直接指向,不存在則創(chuàng)建后指向

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

經典面試題A:

會創(chuàng)建一個對象,編譯器會對該代碼進行優(yōu)化,a存儲的字符串等價于helloabc

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

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

會創(chuàng)建三個對象,a對象和b對象,c對象的創(chuàng)建其實是在堆中,堆中的地址指向字符串常量池的一個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";
        // 判斷兩字符串的值是否相等(區(qū)分大小寫)
        System.out.println(a.equals(b));
        // 判斷兩字符串的值是否相等不區(qū)分大小寫)
        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三種構造器初始化

// 創(chuàng)建一個大小為16的char[] 數組,用于存放字符內容
StringBuffer stringBuffer = new StringBuffer();
// 指定char[]容量大小
StringBuffer stringBuffer1 = new StringBuffer(100);
// 通過給一個string創(chuàng)建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,但不保證同步(不是線程安全的),用在字符串緩沖區(qū)被單個線程使用的時候,如果可能建議優(yōu)先使用該類,因為在大多數的時候,它比StringBuffer要快

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

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

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

到此這篇關于詳解Java中String,StringBuffer和StringBuilder的使用的文章就介紹到這了,更多相關Java String內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用@JsonFormat和@DateTimeFormat對Date格式化操作

    使用@JsonFormat和@DateTimeFormat對Date格式化操作

    這篇文章主要介紹了使用@JsonFormat和@DateTimeFormat對Date格式化操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringBoot如何實現并發(fā)任務并返回結果

    SpringBoot如何實現并發(fā)任務并返回結果

    這篇文章主要介紹了SpringBoot如何實現并發(fā)任務并返回結果問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java設置PDF有序和無序列表的知識點總結

    Java設置PDF有序和無序列表的知識點總結

    在本篇文章中小編給大家整理了關于Java設置PDF有序和無序列表的知識點,需要的朋友們參考下。
    2019-03-03
  • 關于Java中的try-with-resources語句

    關于Java中的try-with-resources語句

    這篇文章主要介紹了關于Java中的try-with-resources語句,try-with-resources是Java中的環(huán)繞語句之一,旨在減輕開發(fā)人員釋放try塊中使用的資源的義務,需要的朋友可以參考下
    2023-05-05
  • Java實現屏幕截圖工具的代碼分享

    Java實現屏幕截圖工具的代碼分享

    這篇文章主要為大家介紹了如何利用Java語言編寫一個電腦屏幕截圖工具,文中的示例代碼講解詳細,對我們學習有一定的幫助,需要的可以參考一下
    2022-05-05
  • 淺談JVM內存溢出原因和解決思路

    淺談JVM內存溢出原因和解決思路

    本文主要介紹了淺談JVM內存溢出原因和解決思路,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • java判斷遠程服務器上的文件是否存在的方法

    java判斷遠程服務器上的文件是否存在的方法

    java判斷遠程服務器上的文件是否存在的方法,需要的朋友可以參考一下
    2013-03-03
  • SpringBoot與單元測試JUnit的結合操作

    SpringBoot與單元測試JUnit的結合操作

    這篇文章主要介紹了SpringBoot與單元測試JUnit的結合操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 深度解析Java中ArrayList的使用

    深度解析Java中ArrayList的使用

    ArrayList?類是一個可以動態(tài)修改的數組,與普通數組的區(qū)別就是它是沒有固定大小的限制,我們可以添加或刪除元素。本文將通過示例帶你深度解析Java中ArrayList的使用,需要的可以參考一下
    2022-09-09
  • 詳解JAVA 函數式編程

    詳解JAVA 函數式編程

    這篇文章主要介紹了JAVA 函數式編程的相關資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07

最新評論