String、StringBuffer、StringBuilder介绍
文章目錄
- String 源碼分析
- 繼承關(guān)系
- CharSequence
- 底層數(shù)據(jù)結(jié)構(gòu)
- 常用構(gòu)造器:
- 無參構(gòu)造器
- 入?yún)镾tring類型
- 入?yún)閏har數(shù)組類型
- 入?yún)镾tringBuffer:
- 入?yún)镾tringBuilder:
- 常用方法
- int length()
- equals()
- char charAt(int index);
- char toCharArray();
- int indexOf(char c)
- in lastIndexOf(char c)
- toUpperCase(); toLowerCase();
- split(char c)
- trim()
- replace(char oldChar,char newChar)
- substring(int beginIndex,int endIndex)
- equalsIgnoreCase(String)
- contains(String)
- String,StringBuffer與StringBuilder的區(qū)別
- 三者共同之處
- 各自的特點(diǎn)
- 主要區(qū)別:
- 運(yùn)行速度
- 線程安全
- 各自適用場景
String 源碼分析
繼承關(guān)系
public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequencefinal修飾的類 不可以被繼承
CharSequence
CharSequence類是java.lang包下的一個接口,此接口對多種不同的對char訪問的統(tǒng)一接口,像String、StringBuffer、StringBuilder類都是CharSequence的子接口;
CharSequence類和String類都可以定義字符串,但是String定義的字符串只能讀,CharSequence定義的字符串是可讀可寫的;
對于抽象類或者接口來說不可以直接使用new的方式創(chuàng)建對象,但是可以直接給它賦值;
用法:
CharSequence a = “abc”; 等價(jià)于: CharSequence a = new String(“abc”);
底層數(shù)據(jù)結(jié)構(gòu)
private final byte[] value;底層是被final修飾的byte數(shù)組,說明String 對象不可被更改。Java 實(shí)現(xiàn)的這個特性叫作 String 對象的不可變性,即 String 對象一旦創(chuàng)建成功,就不能再對它進(jìn)行改變。
常用構(gòu)造器:
無參構(gòu)造器
public String() {this.value = "".value;}返回空字符串的數(shù)組形式。
入?yún)镾tring類型
public String(String original) {this.value = original.value;this.hash = original.hash;}返回原來String對象的各個參數(shù)
入?yún)閏har數(shù)組類型
public String(char value[]) {this.value = Arrays.copyOf(value, value.length);}public String(char value[], int offset, int count) {if (offset < 0) {throw new StringIndexOutOfBoundsException(offset);}if (count <= 0) {if (count < 0) {throw new StringIndexOutOfBoundsException(count);}if (offset <= value.length) {this.value = "".value;return;}}// Note: offset or count might be near -1>>>1.if (offset > value.length - count) {throw new StringIndexOutOfBoundsException(offset + count);}this.value = Arrays.copyOfRange(value, offset, offset+count);}Arrays.copyOf方法進(jìn)行數(shù)組拷貝的
入?yún)镾tringBuffer:
public String(StringBuffer buffer) {synchronized(buffer) {this.value = Arrays.copyOf(buffer.getValue(), buffer.length());}}加鎖進(jìn)行拷貝,保證StringBuffer的線程安全
入?yún)镾tringBuilder:
public String(StringBuilder builder) {this.value = Arrays.copyOf(builder.getValue(), builder.length());}對比StringBuffer入?yún)?#xff0c;如果用StringBuilder作為入?yún)⑹遣患渔i操作的,因?yàn)镾tringBuilder本身線程不安全,但會提升性能。
常用方法
int length()
public int length() {return value.length;}語法:字符串變量名.length();
返回值為 int 類型。得到一個字符串的字符個數(shù)(中、英、空格、轉(zhuǎn)義字符皆為字符,計(jì)入長度)
equals()
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}字符串內(nèi)容比較
char charAt(int index);
語法 :字符串名.charAt(值);
返回值為 char 類型。從字符串中取出指定位置的字符
char toCharArray();
語法 :字符串名.toCharArray();
返回值為 char 數(shù)組類型。將字符串變成一個字符數(shù)組
int indexOf(char c)
語法 :字符串名.indexOf(“字符”);字符串名.indexOf(“字符”,值);
查找一個指定的字符串是否存在,返回的是字符串的位置,如果不存在,則返回-1 。
in lastIndexOf(char c)
得到指定內(nèi)容最后一次出現(xiàn)的下標(biāo)
toUpperCase(); toLowerCase();
字符串大小寫的轉(zhuǎn)換
split(char c)
根據(jù)給定的正則表達(dá)式的匹配來拆分此字符串。形成一個新的String數(shù)組。
trim()
去掉字符串左右空格
replace(char oldChar,char newChar)
新字符替換舊字符,也可以達(dá)到去空格的效果一種。
substring(int beginIndex,int endIndex)
截取字符串
equalsIgnoreCase(String)
忽略大小寫的比較兩個字符串的值是否一模一樣,返回一個布爾值
contains(String)
判斷一個字符串里面是否包含指定的內(nèi)容,返回一個布爾值
String,StringBuffer與StringBuilder的區(qū)別
三者共同之處
都是final類,不允許被繼承,主要是從性能和安全性上考慮的,因?yàn)檫@幾個類都是經(jīng)常被使用著,且考慮到防止其中的參數(shù)被參數(shù)修改影響到其他的應(yīng)用。
各自的特點(diǎn)
StringBuffer是線程安全,可以不需要額外的同步用于多線程中;
StringBuilder是非同步,運(yùn)行于多線程中就需要使用著單獨(dú)同步處理,但是速度就比StringBuffer快多了;
StringBuffer與StringBuilder兩者共同之處:可以通過append、indert進(jìn)行字符串的操作。
String實(shí)現(xiàn)了三個接口:Serializable、Comparable、CarSequence
StringBuilder只實(shí)現(xiàn)了兩個接口Serializable、CharSequence,相比之下String的實(shí)例可以通過compareTo方法進(jìn)行比較,其他兩個不可以。
主要區(qū)別:
運(yùn)行速度
首先說運(yùn)行速度,或者說是執(zhí)行速度,在這方面運(yùn)行速度快慢為:StringBuilder > StringBuffer > String
String最慢的原因:String為字符串常量,而StringBuilder和StringBuffer均為字符串變量,即String對象一旦創(chuàng)建之后該對象是不可更改的,但后兩者的對象是變量,是可以更改的。
線程安全
在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的
如果一個StringBuffer對象在字符串緩沖區(qū)被多個線程使用時,StringBuffer中很多方法可以帶有synchronized關(guān)鍵字,所以可以保證線程是安全的,但StringBuilder的方法則沒有該關(guān)鍵字,所以不能保證線程安全,有可能會出現(xiàn)一些錯誤的操作。所以如果要進(jìn)行的操作是多線程的,那么就要使用StringBuffer,但是在單線程的情況下,還是建議使用速度比較快的StringBuilder。
(一個線程訪問一個對象中的synchronized(this)同步代碼塊時,其他試圖訪問該對象的線程將被阻塞)
各自適用場景
String:適用于少量的字符串操作的情況 StringBuilder:適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況 StringBuffer:適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況總結(jié)
以上是生活随笔為你收集整理的String、StringBuffer、StringBuilder介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Redis缓存穿透、击穿、雪崩及主从复制
- 下一篇: BIO与NIO比较