国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

這篇具有很好參考價值的文章主要介紹了36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、String

?? Java 中用 java.lang.String 類代表字符串
?? 底層用char[]存儲字符數(shù)據。從 Java9 開始,底層使用 byte[]存儲字符數(shù)據

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

public class TestDemo {
    public static void main(String[] args) {
        String bigBrother = "林哥"; // char[] value = {'林', '哥'};
    }
}

?? 字符串的底層是 char[],但是 char 數(shù)組和字符串不能等價。char 數(shù)組是 char 數(shù)組,字符串是字符串。
?? C 語言中是可以把 char 數(shù)組和字符串等價的

?? 所有的 字符串字面量(如:"林哥")都是 String 類的實例
?? String 對象創(chuàng)建完畢后,String 對象的字符內容是不可以修改的

?? String 對象的引用變量的指向是可以修改的

public class TestDemo {
    public static void main(String[] args) {
        String s = "林哥";
        s += "love";
        s = "666";
        test(s);
        // s = 666
        System.out.println("s = " + s);
    }

    private static void test(String str) {
        // str 是局部變量, 生命周期只在 test 方法中
        str += 123;
    }
}

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

二、字符串常量池

?? 字符串常量池:String Constant Pool
?? 從 Java7 開始,字符串常量池是在空間(之前是在方法區(qū))

?? 當遇到字符串字面量的時候,會先在 SCP 中檢索
?? 看 SCP 中是否存在與字面量內容一樣的字符串對象 A ?
?? 如果有,返回字符串對象 A
?? 否則,創(chuàng)建一個新的字符串對象 B,并將其加入到 SCP 中,然后返回 B

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

public class TestDemo {
    public static void main(String[] args) {
        String s1 = "林哥";
        String s2 = "林哥";
        // true
        System.out.println(s1 == s2);
    }
}

三、字符串的初始化

public class TestDemo {
    public static void main(String[] args) {
        String s1 = "林哥";
        String s2 = new String("林哥");
        // 字符串對象 s3 的值和字符串對象 s1 的值是一樣的
        // 底層指向的都是同一個 char 數(shù)組
        String s3 = new String(s1);
        String s4 = new String(s2);

        char[] cs = {'林', '哥'};

        String s5 = new String(cs);
        String s6 = new String(s5);
    }
}

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法


 String s1 = "林哥";
 String s2 = new String("林哥");

?? 上面的兩行代碼中,字符串對象 s1 底層的 char 數(shù)組 value 和字符串對象 s2 底層的 char 數(shù)組是同一個
?? 如下圖所示:String 的構造方法會把傳入的字符串對象的 value 直接賦值給當前對象(當前創(chuàng)建的新字符串對象)的 value
36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

可通過 debug 的方式驗證...

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

?? 上圖:字符串對象 s1 底層的 value 的 id 號是 541
?? 字符串對象 s2 底層的 value 的 id 號也是 541

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

?? 給 String 對象的構造方法傳入字符數(shù)組的時候,底層會拷貝一份該字符數(shù)組,然后才賦值給當前創(chuàng)建的 String 對象的 char 數(shù)組 value
36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

四、String 類的 intern 方法

先看下面的代碼,思考打印結果:

public class TestDemo {
    public static void main(String[] args) {
        String s0 = "林哥";
        String s1 = s0.intern();
        // true
        System.out.println(s1 == s0);

        String s2 = new String(s0);
        // false
        System.out.println(s2 == s0);

        String s3 = s2.intern();
        System.out.println(s3 == s0); // true
        System.out.println(s3 == s2); // false 
    }
}

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法
36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

?? 當字符串的 intern() 方法被調用的時候,如果字符串常量池中已經包含一個字符串對象的內容等于調用 intern()的字符串對象的內容,則返回字符串常量池中的字符串對象。否則,把調用 intern()的字符串對象添加到字符串常量池中,并返回該字符串對象(調用 intern()的字符串對象)

String s3 = s2.intern();

?? s2 調用了intern()方法,如果字符串常量池中存在與 s2 內容一樣的字符串對象 s 的話,返回字符串常量池中的 s 對象;否則,將 s2 添加到字符串常量池中,并返回 s2


只有遇到字符串字面量的時候,才會在字符串常量池中檢索

public class TestDemo {
    public static void main(String[] args) {
        int a = 1, b = 2, c = 3;
        String s1 = String.format("%d_%d_%d", a, b, c);
        String s2 = String.format("%d_%d_%d", a, b, c);
        System.out.println(s1 == s2); // output: false
        
        /*
            只有【字符串字面量】才會在字符串常量池中找檢索
         */
    }
}
public class TestDemo {
    public static void main(String[] args) {
        int a = 1, b = 2, c = 3;
        String s1 = String.format("%d_%d_%d", a, b, c);
        String s2 = String.format("%d_%d_%d", a, b, c);
        System.out.println(s1 == s2); // output: false

        /*
            會把 s1 放入字符串常量池,并返回 s1 指向對象
            s3 和 s1 指向的是同一個對象
         */
        String s3 = s1.intern();

        /*
            會把被 s1 指向的字符串常量池中的字符串對象返回
            s1 和 s4 指向的是同一個對象
         */
        String s4 = s2.intern();

        /*
            返回字符串常量池中的字符串對象, 若 SCP 中沒有, 創(chuàng)建一個放入 SCP, 并返回
         */
        String s5 = "1_2_3";

        System.out.println(s1 == s3); // true
        System.out.println(s1 == s4); // true
        System.out.println(s1 == s5); // true
    }
}

五、字符串常用方法

public class TestDemo {
    public static void main(String[] args) {
        // trim: 去除左右的空格
        String s1 = "  111 2222  ".trim();

        String s = "hAve A niCe Day";
        // toUpperCase: 把小寫字母轉為大寫字母
        String s2 = s.toUpperCase();
        // toLowerCase: 把大寫字母轉換為小寫字母
        String s3 = s.toLowerCase();

        // contains: 是否包含某個子字符串片段
        boolean contains = "Have a nice Day".contains("nice");

        // startsWith: 是否以某個子字符串片段開頭
        boolean startsWith = "Love is love.".startsWith("love");

        // endsWith: 是否以某個子字符串片段結尾
        boolean endsWith = "Love is love".endsWith("love");

        // 將字符串分隔為字符串數(shù)組
        String[] split = "Today_we_have_a_new_student".split("_");
        // output: [Today, we, have, a, new, student]
        System.out.println(Arrays.toString(split));
    }
}

字符串的截取:

public class TestDemo {
    public static void main(String[] args) {
        String nice = "goodMorning";
        // 從下標 4 位置開始截取, 截取到最后
        String s1 = nice.substring(4);
        // output: s1 = Morning
        System.out.println("s1 = " + s1);

        String s = "believe";
        // 從下標 2 位置開始截取, 截取到下標為 5 的位置(不包括下標5位置的字符)
        // 左閉右開
        String s2 = s.substring(2, 5);
        // s2 = lie
        System.out.println("s2 = " + s2);
    }
}

indexOf: 定位字符串所在索引

public class TestDemo {
    public static void main(String[] args) {
        int result1 = "hello".indexOf("e");
        int result2 = "hello".indexOf("a");
        System.out.println(result1); // 1
        System.out.println(result2); // -1
    }
}

?? 如果字符串中不包含該子字符串,返回 -1

lastIndexOf: 定位字符串所在索引

public class TestDemo {
    public static void main(String[] args) {
        // 從左往右開始定位字符串索引
        int result1 = "hello log".indexOf("lo");
        // 從右往左開始定位字符串索引(但數(shù)的時候還是從左往右數(shù))
        int result2 = "hello log".lastIndexOf("lo");
        System.out.println(result1); // 3
        System.out.println(result2); // 6
    }
}

字符串替換:

public class TestDemo {
    public static void main(String[] args) {
        String s1 = "I live you";
        String s2 = s1.replace("live", "like");
        // s1 = I live you
        System.out.println("s1 = " + s1);
        // s2 = I like you
        System.out.println("s2 = " + s2);
    }
}

六、StringBuilder 和 StringBuffer

?? 需要進行大量的字符串改動操作(如拼接、替換)的時候,使用 String 會非常消耗內存、會降低程序性能
??StringBuilderStringBuffer 進行大量字符串拼接或替換的時候,程序性能和內存的消耗特別小

public class TestDemo {
    public static void main(String[] args) {
        String s = "1";
        s += "2";
        s += "3";
        s += "4";
        // s = 1234
        System.out.println("s = " + s);
    }
}

?? 上面代碼,每一次的拼接操作都會產生一個新的字符串對象

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

?? 由于字符串內容的不可變性,每次的拼接操作必定都會產生一個新的字符串對象(如上圖),會存在大量的字符串對象的創(chuàng)建和銷毀操作


public class TestDemo {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("1");
        sb.append("2");
        sb.append("3");
        sb.append("4");
        // 1234
        System.out.println(sb.toString());

        // 鏈式調用
        StringBuffer sBuffer = new StringBuffer("1")
                .append("2")
                .append("3")
                .append("4");
        // 1234
        System.out.println(sBuffer);
    }
}

?? 使用 StringBuilder 和 StringBuffer 則會非常高效
?? StringBuilder 和 StringBuffer 的使用方式(API)都一樣
?? 區(qū)別:StringBuilder 線程安全;StringBuffer 線程安全


?? 常用方法:append、insert、delete、replace、reverse
?? StringBuider 或 StringBuffer 與 String 并不存在繼承關系
?? StringBuilder、StringBuffer、String 都實現(xiàn)了 CharSequence 接口

36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法

?? StringBuilder 的 append 原理:動態(tài)數(shù)組

動態(tài)數(shù)組的實現(xiàn)博主后期在學習,后期再寫文章

結束,如有錯誤請不吝賜教文章來源地址http://www.zghlxwxcb.cn/news/detail-405351.html

到了這里,關于36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Java基礎09 —— 字符序列--String、StringBuilder、StringBuffer區(qū)別及其方法介紹

    字符與字符串 字符類型(char)是Java中的基本數(shù)據類型,占2個字節(jié)16位,默認值是 ‘u0000’ 。字符是用單引號引住的單個符號. 字符串(String)是用雙引號引住的任意個字符,是引用數(shù)據類型,默認值是null 。字符串其實就是字符組成的序列 字符串聲明 舉例: 字符序列 多個字符

    2024年02月09日
    瀏覽(21)
  • java中的String使用注意事項、StringBuilder、StringBuffer、StringJoiner

    java中的String使用注意事項、StringBuilder、StringBuffer、StringJoiner

    String使用注意事項 這里第二次創(chuàng)造了0個對象是因為字符串常量池中已經有\(zhòng)\\"abc\\\" StringBuilder 注意StringBuilder支持鏈式編程 StringBuilder 線程安全與不安全的區(qū)別在于,當系統(tǒng)里存在很多人同時操作同一個StringBuilder就可能出bug,而StringBuilder不會。 StringJoiner

    2024年02月12日
    瀏覽(18)
  • 【Java基礎教程】(三十三)常用類庫篇 · 第三講:可變字符串支持類——解析 StringBuffer與 StringBuilder類~

    【Java基礎教程】(三十三)常用類庫篇 · 第三講:可變字符串支持類——解析 StringBuffer與 StringBuilder類~

    在Java 中,字符串使用 String 類進行表示,但是 String 類所表示的字符串有一個最大的問題:“字符串常量一旦聲明則不可改變,而字符串對象可以改變,但是 改變的是其內存地址的指向”。所以 String 類不適合于被頻繁修改的字符串操作, 所以在這種情況下,往往可以使用

    2024年02月15日
    瀏覽(27)
  • java基礎四-String/StringBuffer/StringBuilder區(qū)別

    String 和 StringBuffer、StringBuilder 的區(qū)別在于 String 聲明的是不可變的對象,每次操作都會生成新的 String 對象,然后將指針指向新的 String 對象,而 StringBuffer、StringBuilder 可以在原有對象的基礎上進行操作,所以在經常改變字符串內容的情況下最好不要使用 String。 StringBuffer 和

    2024年02月14日
    瀏覽(25)
  • 【java】關于String、StringBuffer和StringBuilder的那些事

    【java】關于String、StringBuffer和StringBuilder的那些事

    ? 目錄 一、String 1、構造方法 2、字符串的不可變性 3、字符串的比較 4、 String的常用方法: 二、StringBuider和StringBuffer 1、字符串的拼接 2、StringBuider與StringBuffer 總結 ? ? String類提供的構造方式非常多,常用的就以下兩種: ? 注意: 1、String 是引用類型,內部并不存儲字符串

    2024年04月10日
    瀏覽(25)
  • 【JAVA】String ,StringBuffer 和 StringBuilder 三者有何聯(lián)系?

    【JAVA】String ,StringBuffer 和 StringBuilder 三者有何聯(lián)系?

    個人主頁:【??個人主頁】 系列專欄:【??初識JAVA】 在之前的文章中我們介紹了JAVA中String的運用方法,事實上在JAVA字符串操作中僅僅只知道String方法是遠遠不夠的,今天我們要介紹的 StringBuffer 和 StringBuilder 在字符串操作中同樣占據總要地位。 和 String 類不同的是,S

    2024年02月14日
    瀏覽(24)
  • 【后端面經-Java】String與StringBuffer與StringBuilder的比較

    目錄 1. String 2. StringBuffer 3. StringBuilder 4. 性能提升 5. 總結和比較 面試模擬 參考資料 不可變 查看 String 源碼如下:由源碼可知,String中存儲數(shù)據的數(shù)組被 final 修飾,因此是不可變的 運算和操作 創(chuàng)建對象 創(chuàng)建對象有兩種方式:兩種方式都會在棧中創(chuàng)建一個字符串變量

    2024年02月16日
    瀏覽(20)
  • Java-String、StringBuffer、StringBuilder區(qū)別及相關面試題

    Java-String、StringBuffer、StringBuilder區(qū)別及相關面試題

    在Java編程中,經常會遇到處理字符串的需求。Java提供了多個類來處理字符串,其中最常用的是String、StringBuffer和StringBuilder類。本文將介紹這三個類的基本用法和區(qū)別。 String是Java中最常用的字符串類,它是不可變的,也就是說一旦被創(chuàng)建,它的值就不能被改變。下面是Stri

    2024年02月11日
    瀏覽(21)
  • StringBuilder > StringBuffer > String

    StringBuilder , StringBuffer 和 String 都是 Java 中用于操作字符串的類,但它們在性能、線程安全性和用途上有一些區(qū)別。 1. String: String 類是 Java 中的不可變字符串類。一旦創(chuàng)建了字符串對象,它的值就不能被修改。每次對字符串進行操作(連接、替換等),都會創(chuàng)建一個新的字符

    2024年02月11日
    瀏覽(29)
  • String、StringBuffer、StringBuilder 的區(qū)別?

    一. 介紹 String、StringBuffer、StringBuilder: ?? 前言:?String、StringBuffer、StringBuilder 均在java.lang包下; String: ?在Java中,String是一個特殊的引用類型,用于表示文本字符串。它提供了許多方法來操作和處理字符串,比如連接、截取、查找、替換等。 String類內部使用字符數(shù)組(ch

    2024年02月13日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包