您好,登錄后才能下訂單哦!
字符串在開發(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ū)別是什么?
查看源碼簡(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修飾的,所以是不可繼承的。
String中的對(duì)象是不可變的,也可以理解為常量,線程安全。AbstractStringBuilder是StringBuilder和StringBuffer的父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。StringBuffer對(duì)方法加了同步鎖或者對(duì)調(diào)用的方法加了同步鎖,所以是線程安全的。而StringBuilder并沒有對(duì)方法加同步鎖,所以是線程不安全的。
每次對(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)。
//返回給定位置的代碼單元。
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)
//構(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()
免責(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)容。