溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中操作字符串的類是什么

發(fā)布時間:2021-06-15 09:55:12 來源:億速云 閱讀:176 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Java中操作字符串的類是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

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

操作字符串的類主要用三個,分別是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)使用=對String類初始化的時候,會在常量池創(chuàng)建對象,將引用s1指向常量池中的地址.

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

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

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

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

可變字符串

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

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
    }
}

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

StringBuffer類

和StringBuilder類對比發(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)建一個新的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操作字符串的類主要有三個,分別是String類,StringBuffer類和StringBuilder類.這三個類的底層都是以char[]形式保存字符串對象的.他們之間的區(qū)別主要體現(xiàn)在:

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

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

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

以上是“Java中操作字符串的類是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI