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