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

Java有哪些操作字符串的類?區(qū)別在哪?

 更新時(shí)間:2021年06月13日 09:08:30   作者:Lf_MrF  
今天給大家愛帶來(lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java操作字符串的類展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

操作字符串的類都有哪些?區(qū)別是什么?

操作字符串的類主要用三個(gè),分別是String類,StringBuffer類和StringBuilder類.

不可變字符串

String類

public class StringTest {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");	
        System.out.println(s1 == s2);	// true
        System.out.println(s2 == s3);	// false
        s2 = "abc" + "def";
        System.out.println(s1 == s2);	// false
        String s4 = "abcdef";
        System.out.println(s4 == s2);	// true
    }
}

1.當(dāng)使用=對(duì)String類初始化的時(shí)候,會(huì)在常量池創(chuàng)建對(duì)象,將引用s1指向常量池中的地址.

2.創(chuàng)建s2的時(shí)候,會(huì)先在常量池中檢查是否有"abc"的對(duì)象,如果有則直接將s2指向常量池中的"abc".所以s1和s2指向的是相同的對(duì)象.

3.使用new關(guān)鍵字創(chuàng)建String對(duì)象的時(shí)候,會(huì)在堆空間中開辟一塊內(nèi)存,然后在堆中對(duì)s3進(jìn)行初始化,s3指向的是堆內(nèi)存空間中的一塊區(qū)域.

4.當(dāng)我們對(duì)s2進(jìn)行修改的時(shí)候,其實(shí)是在常量池中添加了新的對(duì)象"abcdef",此時(shí)我們創(chuàng)建新的對(duì)象s4會(huì)和創(chuàng)建s2的步驟相同.s4在常量池中找到了"abcdef",所以直接指向這個(gè)對(duì)象.

當(dāng)我們對(duì)String類型的變量進(jìn)行操作的時(shí)候,其實(shí)每次改變都是創(chuàng)建除了新的對(duì)象.

可變字符串

StringBuffer和StringBuilder類中都提供了增刪字符串的方法,下面展示一個(gè)在原始對(duì)象上增加新的字符的示例.

public class StringTest2 {
    public static void main(String[] args) {
        StringBuffer sb1 = new StringBuffer("abc");
        StringBuilder sb2 = new StringBuilder("abc");
        System.out.println(sb1.hashCode());	// 460141958
        System.out.println(sb2.hashCode());	// 1163157884
        sb1.append("def");
        sb2.append("def");
        System.out.println(sb1.hashCode()); // 460141958
        System.out.println(sb2.hashCode()); // 1163157884
    }
}

通過(guò)這個(gè)例子我們能清晰看到,s1和s2在增加元素前后仍舊是同一個(gè)對(duì)象.
StringBuffer和StringBuilder都繼承了AbstractStringBuilder類.

StringBuffer類

和StringBuilder類對(duì)比發(fā)現(xiàn),StringBuffer類中的方法沒有使用synchronized 關(guān)鍵字進(jìn)行修飾.

   @Override
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }

StringBuilder類

  @Override
    public synchronized StringBuffer append(Object obj) {
        toStringCache = null;
        super.append(String.valueOf(obj));
        return this;
    }

AbstractStringBuilder類的append方法

擴(kuò)容方法:調(diào)用ensureCapacityInternal()方法檢查初始char[] value空間是否足夠,如果不夠的話,就進(jìn)行擴(kuò)容操作.

 public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        // 查看空間是否足夠
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }
 private void ensureCapacityInternal(int minimumCapacity) {
        // overflow-conscious code
        // 如果空間不夠就重新開辟一塊新的空間
        if (minimumCapacity - value.length > 0) {
            value = Arrays.copyOf(value,
                    newCapacity(minimumCapacity));
        }
    }

copyOf方法:重新創(chuàng)建一個(gè)新的char數(shù)組然后將原數(shù)組數(shù)據(jù)拷貝到新數(shù)組去.

    public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

小結(jié)

Java操作字符串的類主要有三個(gè),分別是String類,StringBuffer類和StringBuilder類.這三個(gè)類的底層都是以char[]形式保存字符串對(duì)象的.他們之間的區(qū)別主要體現(xiàn)在:

1.String類型進(jìn)行修改操作之后相當(dāng)于重新創(chuàng)建對(duì)象,StringBuffer和StringBuilder進(jìn)行增刪操作都是針對(duì)同一個(gè)對(duì)象.

2.StringBuffer中的大部分方法都沒有使用synchronized關(guān)鍵字修飾,所以性能更高(我刷題的時(shí)候也都是寫這個(gè)).單線程情況下首選使用StringBuffer類,多線程環(huán)境下需要使用StringBuilder類保證線程安全.

3.如果字符串聲明之后不需要進(jìn)行改動(dòng),則直接聲明String類是最好的選擇,不使用new關(guān)鍵字聲明String對(duì)象時(shí),它不會(huì)再堆內(nèi)存中開辟空間,而是直接指向String常量池.這樣可以實(shí)現(xiàn)復(fù)用,降低資源消耗.

擴(kuò)展閱讀

Java基礎(chǔ)系列第一彈之方法重載和方法重寫的區(qū)別
Java基礎(chǔ)系列第二彈之Java多態(tài)成員訪問的特點(diǎn)

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

相關(guān)文章

  • Hibernate三種狀態(tài)和Session常用的方法

    Hibernate三種狀態(tài)和Session常用的方法

    本文主要介紹了Hibernate三種狀態(tài)和Session常用的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 解決SpringBoot整合MybatisPlus分模塊管理遇到的bug

    解決SpringBoot整合MybatisPlus分模塊管理遇到的bug

    這篇文章主要介紹了解決SpringBoot整合MybatisPlus分模塊管理遇到的bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringCloud實(shí)現(xiàn)全鏈路灰度發(fā)布的示例詳解

    SpringCloud實(shí)現(xiàn)全鏈路灰度發(fā)布的示例詳解

    灰度發(fā)布是指在軟件或服務(wù)發(fā)布過(guò)程中,將新版本的功能或服務(wù)以較小的比例引入到生產(chǎn)環(huán)境中,僅向部分用戶或節(jié)點(diǎn)提供新功能的一種發(fā)布策略,下面我們就來(lái)學(xué)習(xí)一下SpringCloud如何實(shí)現(xiàn)全鏈路灰度發(fā)布
    2023-11-11
  • java判斷字符串中是否包含中文并過(guò)濾中文

    java判斷字符串中是否包含中文并過(guò)濾中文

    這篇文章主要為大家詳細(xì)介紹了java判斷字符串中是否包含中文,并過(guò)濾掉中文,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • dom4j讀取XML文件詳解

    dom4j讀取XML文件詳解

    這篇文章主要為大家詳細(xì)介紹了dom4j讀取XML文件的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐

    springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐

    在系統(tǒng)業(yè)務(wù)中,需要想客戶發(fā)送手機(jī)驗(yàn)證碼,進(jìn)行驗(yàn)證后,才能提交,本文主要介紹了springboot實(shí)現(xiàn)極驗(yàn)校驗(yàn)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • IDEA2020配置Git的方法步驟

    IDEA2020配置Git的方法步驟

    這篇文章主要介紹了IDEA2020配置Git的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法示例

    Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法示例

    這篇文章主要給大家介紹了關(guān)于Java處理時(shí)間格式CST和GMT轉(zhuǎn)換方法的相關(guān)資料,相信很多小伙伴在時(shí)間格式轉(zhuǎn)換的時(shí)候非常頭疼,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解

    SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解

    這篇文章主要介紹了SpringBoot集成JmsTemplate(隊(duì)列模式和主題模式)及xml和JavaConfig配置詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java封裝、繼承、多態(tài)三大特征的理解

    Java封裝、繼承、多態(tài)三大特征的理解

    封裝、繼承、多態(tài)三大特征是java中比較常用的,務(wù)必要掌握,下面給大家介紹Java封裝、繼承、多態(tài)三大特征的理解,有不清楚的朋友可以一起學(xué)習(xí)下
    2016-06-06

最新評(píng)論