日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

String、StringBuffer、StringBuilder介绍

發(fā)布時間:2025/5/22 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 String、StringBuffer、StringBuilder介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 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>, CharSequence

final修飾的類 不可以被繼承

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。