最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java字符串處理全解析(String、StringBuilder與StringBuffer)

 更新時(shí)間:2025年04月18日 10:42:19   作者:兔子蟹子  
這篇文章主要介紹了Java字符串處理全解析(String、StringBuilder與StringBuffer),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧

Java字符串處理全解析:String、StringBuilder與StringBuffer

一、String類基礎(chǔ)

1. String的本質(zhì)

  • 不可變對(duì)象:Java中的String對(duì)象一旦創(chuàng)建就不能修改
  • 底層實(shí)現(xiàn):基于private final char value[]字符數(shù)組
  • 字符串池:JVM維護(hù)的特殊存儲(chǔ)區(qū)域,用于存儲(chǔ)字符串字面量

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

// 方式1:字面量創(chuàng)建(直接存入字符串池)
String s1 = "Hello";
// 方式2:new創(chuàng)建(堆內(nèi)存新建對(duì)象)
String s2 = new String("Hello");

3. 字符串比較

String a = "Java";
String b = "Java";
String c = new String("Java");
System.out.println(a == b);      // true(指向字符串池同一對(duì)象)
System.out.println(a == c);      // false(不同對(duì)象)
System.out.println(a.equals(c)); // true(內(nèi)容相同)

4. 常用方法

方法說明示例
length()獲取長(zhǎng)度"abc".length() → 3
charAt()獲取指定位置字符"abc".charAt(1) → ‘b’
substring()截取子串"Hello".substring(1,3) → “el”
indexOf()查找字符位置"Java".indexOf('a') → 1
toLowerCase()轉(zhuǎn)小寫"Java".toLowerCase() → “java”
toUpperCase()轉(zhuǎn)大寫"Java".toUpperCase() → “JAVA”
trim()去除首尾空格" Java ".trim() → “Java”
split()分割字符串"a,b,c".split(",") → [“a”,“b”,“c”]
replace()替換字符"Java".replace('a','o') → “Jovo”

二、StringBuilder與StringBuffer

1. 可變字符串類比較

特性StringStringBuilderStringBuffer
可變性不可變可變可變
線程安全
性能中等
使用場(chǎng)景少量操作單線程大量操作多線程大量操作

2. StringBuilder核心方法

StringBuilder sb = new StringBuilder();
// 鏈?zhǔn)秸{(diào)用
sb.append("Java").append(" is").append(" awesome!");
System.out.println(sb); // "Java is awesome!"
sb.insert(5, "really ");  // 插入
sb.delete(5, 12);        // 刪除
sb.replace(0, 4, "Kotlin"); // 替換
sb.reverse();             // 反轉(zhuǎn)

3. StringBuffer線程安全示例

class BufferThread extends Thread {
    private StringBuffer buffer;
    public BufferThread(StringBuffer buffer) {
        this.buffer = buffer;
    }
    @Override
    public void run() {
        for(int i=0; i<100; i++){
            buffer.append(i);
        }
    }
}
public class ThreadSafeDemo {
    public static void main(String[] args) throws InterruptedException {
        StringBuffer buffer = new StringBuffer();
        Thread t1 = new BufferThread(buffer);
        Thread t2 = new BufferThread(buffer);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println("最終長(zhǎng)度: " + buffer.length()); // 正確輸出200
    }
}

三、性能對(duì)比實(shí)驗(yàn)

1. 字符串拼接測(cè)試

public class PerformanceTest {
    static final int LOOP_COUNT = 100000;
    public static void stringTest() {
        long start = System.currentTimeMillis();
        String s = "";
        for(int i=0; i<LOOP_COUNT; i++){
            s += "a";
        }
        System.out.println("String耗時(shí): " + (System.currentTimeMillis()-start) + "ms");
    }
    public static void builderTest() {
        long start = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<LOOP_COUNT; i++){
            sb.append("a");
        }
        System.out.println("StringBuilder耗時(shí): " + (System.currentTimeMillis()-start) + "ms");
    }
    public static void bufferTest() {
        long start = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer();
        for(int i=0; i<LOOP_COUNT; i++){
            sb.append("a");
        }
        System.out.println("StringBuffer耗時(shí): " + (System.currentTimeMillis()-start) + "ms");
    }
    public static void main(String[] args) {
        stringTest();    // 約4500ms
        builderTest();  // 約5ms
        bufferTest();    // 約10ms
    }
}

2. 內(nèi)存占用分析

// 使用jvisualvm觀察內(nèi)存變化
public class MemoryDemo {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("開始測(cè)試...");
        Thread.sleep(10000);  // 等待連接VisualVM
        // String會(huì)產(chǎn)生大量中間對(duì)象
        String s = "";
        for(int i=0; i<100000; i++){
            s += i;
        }
        // StringBuilder只創(chuàng)建一個(gè)對(duì)象
        StringBuilder sb = new StringBuilder();
        for(int i=0; i<100000; i++){
            sb.append(i);
        }
        Thread.sleep(10000);  // 觀察內(nèi)存變化
    }
}

四、字符串最佳實(shí)踐

1. 選擇策略

  • String:少量操作、字符串常量、作為方法參數(shù)
  • StringBuilder:?jiǎn)尉€程環(huán)境下大量字符串操作
  • StringBuffer:多線程環(huán)境下大量字符串操作

2. 優(yōu)化技巧

// 不好的寫法
String result = "";
for(String str : stringList) {
    result += str;  // 每次循環(huán)創(chuàng)建新String對(duì)象
}
// 好的寫法
StringBuilder builder = new StringBuilder();
for(String str : stringList) {
    builder.append(str);
}
String result = builder.toString();

3. 字符串常量池優(yōu)化

// 推薦寫法(利用字符串池)
String s1 = "Hello";  
String s2 = "Hello";  // 復(fù)用s1對(duì)象
// 不推薦寫法(創(chuàng)建多余對(duì)象)
String s3 = new String("Hello");  // 強(qiáng)制創(chuàng)建新對(duì)象

五、擴(kuò)展知識(shí)

1. 字符串壓縮(Java 9+)

Java 9后String底層改用byte[]存儲(chǔ),并添加了編碼標(biāo)志字段:

// 查看字符串編碼方式
String str = "你好Java";
Field field = String.class.getDeclaredField("coder");
field.setAccessible(true);
byte coder = (byte) field.get(str);
System.out.println(coder);  // 0表示Latin-1,1表示UTF-16

2. 字符串拼接底層優(yōu)化

// Java編譯器會(huì)自動(dòng)優(yōu)化為StringBuilder
String s = "a" + "b" + "c";
// 編譯后等價(jià)于:
String s = new StringBuilder().append("a").append("b").append("c").toString();

3. 正則表達(dá)式應(yīng)用

// 驗(yàn)證郵箱格式
String email = "test@example.com";
String regex = "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$";
boolean isValid = email.matches(regex);
// 提取數(shù)字
String text = "訂單123金額456";
Pattern pattern = Pattern.compile("\\d+");
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {
    System.out.println("找到數(shù)字: " + matcher.group());
}

4. 字符串格式化

// 傳統(tǒng)方式
String info1 = String.format("姓名: %s, 年齡: %d", "張三", 25);
// Java 15+文本塊
String json = """
    {
        "name": "%s",
        "age": %d
    }
    """.formatted("李四", 30);

六、高級(jí)應(yīng)用案例

1. 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的模板引擎

public class TemplateEngine {
    private final String template;
    public TemplateEngine(String template) {
        this.template = template;
    }
    public String render(Map<String, Object> params) {
        StringBuilder result = new StringBuilder(template);
        for(Map.Entry<String, Object> entry : params.entrySet()) {
            String key = "${" + entry.getKey() + "}";
            String value = entry.getValue().toString();
            int index;
            while((index = result.indexOf(key)) != -1) {
                result.replace(index, index + key.length(), value);
            }
        }
        return result.toString();
    }
    public static void main(String[] args) {
        String template = "歡迎您,${user}!今天是${day}。";
        Map<String, Object> params = new HashMap<>();
        params.put("user", "王五");
        params.put("day", "2023-05-20");
        TemplateEngine engine = new TemplateEngine(template);
        System.out.println(engine.render(params));
    }
}

2. 字符串相似度比較

public class StringSimilarity {
    // 計(jì)算Levenshtein距離
    public static int levenshteinDistance(String a, String b) {
        int[][] dp = new int[a.length()+1][b.length()+1];
        for(int i=0; i<=a.length(); i++) dp[i][0] = i;
        for(int j=0; j<=b.length(); j++) dp[0][j] = j;
        for(int i=1; i<=a.length(); i++) {
            for(int j=1; j<=b.length(); j++) {
                int cost = (a.charAt(i-1) == b.charAt(j-1)) ? 0 : 1;
                dp[i][j] = Math.min(
                    Math.min(dp[i-1][j]+1, dp[i][j-1]+1),
                    dp[i-1][j-1]+cost
                );
            }
        }
        return dp[a.length()][b.length()];
    }
    // 計(jì)算相似度百分比
    public static double similarity(String a, String b) {
        int maxLen = Math.max(a.length(), b.length());
        if(maxLen == 0) return 1.0;
        return (1 - (double)levenshteinDistance(a,b)/maxLen) * 100;
    }
    public static void main(String[] args) {
        String s1 = "kitten";
        String s2 = "sitting";
        System.out.printf("相似度: %.2f%%", similarity(s1, s2));
    }
}

七、常見面試題解析

1. String為什么設(shè)計(jì)為不可變?

  • 安全性:作為參數(shù)傳遞時(shí)不會(huì)被意外修改
  • 線程安全:無需同步即可在多線程中使用
  • 緩存哈希:String常用作HashMap的key,hashCode可緩存
  • 字符串池:實(shí)現(xiàn)字符串常量池的基礎(chǔ)

2. String s = new String(“xyz”)創(chuàng)建了幾個(gè)對(duì)象?

  • 如果"xyz"不在字符串池中:2個(gè)(字符串池中1個(gè),堆中1個(gè))
  • 如果"xyz"已在字符串池中:1個(gè)(只在堆中創(chuàng)建新對(duì)象)

3. 如何高效拼接字符串?dāng)?shù)組?

// 使用StringJoiner(Java 8+)
StringJoiner sj = new StringJoiner(", ", "[", "]");
for(String str : array) {
    sj.add(str);
}
String result = sj.toString();
// 或者直接使用String.join()
String result = String.join(", ", array);

4. 如何實(shí)現(xiàn)字符串反轉(zhuǎn)?

// 方法1:使用StringBuilder
new StringBuilder(str).reverse().toString();
// 方法2:字符數(shù)組交換
char[] chars = str.toCharArray();
for(int i=0, j=chars.length-1; i<j; i++,j--) {
    char temp = chars[i];
    chars[i] = chars[j];
    chars[j] = temp;
}
new String(chars);

八、總結(jié)與最佳實(shí)踐

1. 關(guān)鍵點(diǎn)回顧

  • String是不可變對(duì)象,適合少量操作和作為常量
  • StringBuilder是可變、非線程安全的字符串操作類
  • StringBuffer是線程安全版本的StringBuilder
  • 大量字符串操作時(shí)應(yīng)避免直接使用String

2. 性能優(yōu)化建議

  • 預(yù)分配StringBuilder容量:new StringBuilder(initialCapacity)
  • 避免在循環(huán)中使用+拼接字符串
  • 使用String.join()替代手動(dòng)拼接分隔字符串
  • 考慮使用CharSequence接口作為方法參數(shù)類型

通過深入理解Java字符串處理機(jī)制,開發(fā)者可以編寫出更高效、更健壯的字符串處理代碼,這對(duì)日常開發(fā)中的文本處理、數(shù)據(jù)格式化和系統(tǒng)間通信等場(chǎng)景至關(guān)重要。

到此這篇關(guān)于Java字符串處理的文章就介紹到這了,更多相關(guān)Java字符串處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring中HandlerMethod類源碼詳細(xì)解析

    Spring中HandlerMethod類源碼詳細(xì)解析

    這篇文章主要介紹了Spring中HandlerMethod類源碼詳細(xì)解析,HandlerMethod類用于封裝控制器方法信息,包含類信息、方法Method對(duì)象、參數(shù)、注解等信息,具體的接口請(qǐng)求是可以根據(jù)封裝的信息調(diào)用具體的方法來執(zhí)行業(yè)務(wù)邏輯,需要的朋友可以參考下
    2023-11-11
  • 使用Java第三方實(shí)現(xiàn)發(fā)送短信功能

    使用Java第三方實(shí)現(xiàn)發(fā)送短信功能

    這篇文章主要介紹了使用Java第三方實(shí)現(xiàn)發(fā)送短信功能,在一些開發(fā)中,經(jīng)常需要有給用戶發(fā)送短信接收驗(yàn)證碼的功能,那么在Java中該如何實(shí)現(xiàn)呢,今天我們就一起來看一看
    2023-03-03
  • JDK自帶的四大命令行工具(jstat/jstack/jmap/jhat)的使用詳解

    JDK自帶的四大命令行工具(jstat/jstack/jmap/jhat)的使用詳解

    jstat、jstack、jmap、jhat這四個(gè)是?JDK?自帶的線上問題排查核心工具,專門用于定位?Java?應(yīng)用的性能瓶頸、內(nèi)存泄漏、死鎖、CPU?飆高等問題,無需額外安裝,只要裝了?JDK?就能用,感興趣的小伙伴可以了解下
    2026-06-06
  • 用SpringBoot+Vue+uniapp小程序?qū)崿F(xiàn)在線房屋裝修管理系統(tǒng)

    用SpringBoot+Vue+uniapp小程序?qū)崿F(xiàn)在線房屋裝修管理系統(tǒng)

    這篇文章主要介紹了用SpringBoot+Vue+uniapp實(shí)現(xiàn)在線房屋裝修管理系統(tǒng),針對(duì)裝修樣板信息管理混亂,出錯(cuò)率高,信息安全性差,勞動(dòng)強(qiáng)度大,費(fèi)時(shí)費(fèi)力等問題開發(fā)了這套系統(tǒng),需要的朋友可以參考下
    2023-03-03
  • Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解

    Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解

    這篇文章主要為大家介紹了Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 解決mapstruct在eclipse生成不了mapper的實(shí)現(xiàn)類問題

    解決mapstruct在eclipse生成不了mapper的實(shí)現(xiàn)類問題

    這篇文章主要介紹了解決mapstruct在eclipse生成不了mapper的實(shí)現(xiàn)類問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Java利用poi實(shí)現(xiàn)word表格轉(zhuǎn)excel

    Java利用poi實(shí)現(xiàn)word表格轉(zhuǎn)excel

    這篇文章主要為大家詳細(xì)介紹了Java如何利用poi實(shí)現(xiàn)word表格轉(zhuǎn)excel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • Java中ArrayList初始化的四種方法詳解

    Java中ArrayList初始化的四種方法詳解

    這篇文章主要介紹了Java中ArrayList初始化的四種方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Vert.x運(yùn)行環(huán)境搭建流程圖解

    Vert.x運(yùn)行環(huán)境搭建流程圖解

    這篇文章主要介紹了Vert.x運(yùn)行環(huán)境搭建流程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Spring中的事務(wù)傳播行為示例詳解

    Spring中的事務(wù)傳播行為示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring中事務(wù)傳播行為的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論

弥勒县| 华亭县| 岳阳市| 镇安县| 新蔡县| 策勒县| 台中县| 买车| 阜新市| 望城县| 水城县| 政和县| 平度市| 开平市| 恩施市| 湘阴县| 新野县| 连云港市| 渝中区| 公主岭市| 广东省| 南汇区| 文成县| 开原市| 东丽区| 江华| 临城县| 哈巴河县| 利辛县| 延长县| 吉安市| 民丰县| 开封县| 新绛县| 黔江区| 鄂伦春自治旗| 区。| 专栏| 扶余县| 炉霍县| 积石山|