溫馨提示×

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

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

String、StringBuffer、StringBuilder

發(fā)布時(shí)間:2020-07-08 21:24:03 來源:網(wǎng)絡(luò) 閱讀:289 作者:不倒翁88 欄目:編程語言

字符串在開發(fā)中經(jīng)常使用到,但是Java中提供三種字符串操作的類,String、StringBuffer以及StringBuilder,那么它們有什么區(qū)別以及怎么使用呢?
從概念上講,Java字符串就是Unicode字符序列,例如,串"Java\u2122"由5個(gè)Unicode字符J、a、v、a和TM 。Java沒有內(nèi)置的字符串類型,而是在標(biāo)準(zhǔn)Java類庫(kù)中提供了一個(gè)預(yù)定義類,很自然的叫做String。每個(gè)雙引號(hào)“”括起來的字符串都是String類的一個(gè)實(shí)例:

String e = "";   //an empty string
String greeting = "Hello";

那么這三者的區(qū)別是什么?

1、可變性

查看源碼簡(jiǎn)單來說,String類中使用final關(guān)鍵字修飾的字符數(shù)組保存字符串,所以String對(duì)象是不可變的:
String.java

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char value[];
    private int hash;
    ...
}

而StringBuilder和StringBuffer都繼承自AbstractStringBuilder,在AbstractStringBuilder類中也是使用字符數(shù)組來保存字符串的,但是沒有用final關(guān)鍵字修飾:
AbstractStringBuilder.java

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;
    int count;
    AbstractStringBuilder(){
    }
    AbstractStringBuilder(int capacity){
        valeu = new char[capacity];
    }
    ...
}

StringBuilder.java

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{
    public StringBuilder() {
        super(16);
    }
    ...
}

StringBuffer.java

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{
    private transient char[] toStringCache;
    public StringBuffer() {
        super(16);
    }
    ...
}

從而也可以看出三個(gè)類也是用final修飾的,所以是不可繼承的。

2、線程安全性

String中的對(duì)象是不可變的,也可以理解為常量,線程安全。AbstractStringBuilder是StringBuilder和StringBuffer的父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對(duì)方法加了同步鎖或者對(duì)調(diào)用的方法加了同步鎖,所以是線程安全的。而StringBuilder并沒有對(duì)方法加同步鎖,所以是線程不安全的。

3、性能

每次對(duì)String進(jìn)行改變的時(shí)候,都會(huì)生成一個(gè)新的String對(duì)象,然后將引用指向新的String對(duì)象。StringBuffer和StringBuilder每次都是對(duì)對(duì)象本身進(jìn)行操作,而不生成新的對(duì)象也不改變引用的指向。相同情況下使用StringBuilder相比使用StringBuffer僅能獲得10%-15%左右的性能提升,卻要冒線程不安全的風(fēng)險(xiǎn)。

4、使用建議

  1. 操作少量數(shù)據(jù) String
  2. 單線程,字符串緩沖區(qū)下操作大量數(shù)據(jù) StringBuilder
  3. 多線程,字符串緩沖區(qū)下操作大量數(shù)據(jù) StringBuffer

5、常用API

  • java.lang.String
//返回給定位置的代碼單元。
char charAt(int index)

//按照字典順序,如果字符串位于other之前,返回一個(gè)負(fù)數(shù);如果字符串在other之后,返回一個(gè)正數(shù);如果兩個(gè)字符串相等,返回0.
int compareTo(String other)

//用數(shù)組中offset開始的count個(gè)碼點(diǎn)構(gòu)成一個(gè)字符串
new String(int[] codePoints, int offset, int count) 

//如果字符串與other相等,返回true,反之返回false
boolean equals(Object other)

//如果字符串與other相等(忽略大小寫),返回true,反之返回false
boolean equalsIgnoreCase(String other) 

//如果字符串以prefix開頭,返回true
boolean startsWith(String prefix) 

//如果字符串以suffix結(jié)尾,返回true
boolean endsWith(String suffix)

//返回字符串str或代碼點(diǎn)cp匹配的第一個(gè)子串開始的位置。這個(gè)位置從索引0或者fromIndex開始計(jì)算。
//如果在原始串中不存在str,返回-1
int indexOf(String str)
int indexOf(String str, int fromIndex) 
int indexOf(int cp) 
int indexOf(int cp, int fromIndex) 

//返回字符串str或代碼點(diǎn)cp匹配的最后一個(gè)子串開始的位置。這個(gè)位置從原始串結(jié)尾端或fromIndex開始計(jì)算
int lastIndexOf(String str)
int lastIndexOf(String str, int fromIndex) 
int lastIndexOf(int cp) 
int lastIndexOf(int cp, int fromIndex) 

//返回字符串的長(zhǎng)度
int length() 

//返回一個(gè)新字符串。這個(gè)字符串用newString代替原始字符串中所有oldString。
//可以用String或StringBuffer或StringBuilder對(duì)象作為CharSequence參數(shù)。
String replace(CharSequence oldString, CharSequence newString) 

//返回一個(gè)新字符串。這個(gè)字符串包含原始字符串中從beginIndex到串尾的所有代碼單元
String substring(int beginIndex)

//返回一個(gè)新字符串。這個(gè)字符串包含原始字符串中從beginIndex到endindex-1的所有代碼單元
String substring(int beginIndex, int endIndex)

//返回一個(gè)新字符串。這個(gè)字符串將原始字符串中的大寫改為小寫
String toLowerCase()

//返回一個(gè)新字符串。這個(gè)字符串將原始字符串中的小寫改為大寫
String toUpperCase()

//返回一個(gè)新字符串。這個(gè)字符串將刪除原始字符串頭部和尾部的空格
String trim()

//返回一個(gè)新字符串。用給定的定界符連接所有元素
String join(CharSequence delimiter, CharSequence... elements)
  • java.lang.StringBulider
//構(gòu)造一個(gè)空字符串構(gòu)建器
StringBuilder()

//返回構(gòu)建器或緩沖器中的代碼單元數(shù)量
int length()

//追加一個(gè)字符串并返回this
StringBuilder append(char c)

//將第i個(gè)代碼單元設(shè)置為c
void setCharAt(int i, chanr c)

//在offset位置插入一個(gè)字符串并返回this
StringBuilder insert(int offset, String str)

//刪除偏移量從startIndex到endIndex-1的代碼單元并返回this
StringBuilder delete(int startIdnex, int endIndex)

//返回一個(gè)與構(gòu)建器或緩沖器內(nèi)容相同的字符串
String toString()
  • java.lang.StringBuffer
    與StringBuilder基本相同
向AI問一下細(xì)節(jié)

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

AI