国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

String源碼解讀

zebrayoung / 2183人閱讀

摘要:定義是類型,表示該類不能繼承,同時實現(xiàn)了三個接口。的序列化機制是通過在運行時判斷類的來驗證版本一致性。將源字符數(shù)組數(shù)據(jù)一一復(fù)制到中的字符數(shù)組中。可以通過來解碼指定的數(shù)組,將其解碼成的數(shù)組,構(gòu)造。

String是常量,在定義之后不能被改變,字符串緩沖區(qū)支持可變的字符串。因為String對象是不可變的,所以可以共享。

定義
public final class String implements java.io.Serializable, Comparable, CharSequence{}

String 是final類型,表示該類不能繼承,同時實現(xiàn)了三個接口java.io.Serializable, Comparable, CharSequence

屬性
 private final char value[];

final類型的字符數(shù)組,用來存儲字符串的內(nèi)容,因為被final修飾,所以String一旦初始化之后是不能被更改的。

  private int hash;

緩存的hashCode值,默認(rèn)為0。

  private static final long serialVersionUID = -6849794470754667710L;
   
  private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];

String實現(xiàn)了Serializable接口,所以支持序列化和反序列化。

java 的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性。在進(jìn)行反序列化時,JVM會把傳過來的字節(jié)流中的serialVersionUID與本地響應(yīng)實體的serialVersionUID進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,否則就拋出版本不一致的異常(InvalidCastException)。

構(gòu)造方法

使用字符數(shù)組

當(dāng)使用字符串?dāng)?shù)組創(chuàng)建的時候,會用的Arrays.copyOf方法和Arrays.copyOfRange方法。將源字符數(shù)組數(shù)據(jù)一一復(fù)制到String中的字符數(shù)組中。

  //offset為起始位置,count為數(shù)量
  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);
    }

字符串構(gòu)造

使用字符串創(chuàng)建時,會將源String中的valuehash兩個屬性直接賦值給目標(biāo)String。

 public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

字節(jié)數(shù)組構(gòu)造
char[]字符數(shù)組是以unicode碼來存儲的,Stringchar 為內(nèi)存形式,byte是網(wǎng)絡(luò)傳輸或存儲的序列化形式。可以通過charset來解碼指定的byte數(shù)組,將其解碼成unicode的char[]數(shù)組,構(gòu)造String。

String(byte bytes[]) 

String(byte bytes[], int offset, int length)

String(byte bytes[], Charset charset)

String(byte bytes[], String charsetName)

String(byte bytes[], int offset, int length, Charset charset)

String(byte bytes[], int offset, int length, String charsetName)

使用StringbuiderStringBuffer構(gòu)造
雖然存在當(dāng)前的構(gòu)造方式,但是和toString()方法相比,效率比較低。所以可以直接使用toString()代替。

    public String(StringBuffer buffer) {
        synchronized(buffer) {
            this.value = Arrays.copyOf(buffer.getValue(), buffer.length());
        }
    }

    public String(StringBuilder builder) {
        this.value = Arrays.copyOf(builder.getValue(), builder.length());
    }
其他方法 getBytes
String s = "你好,世界!"; 
byte[] bytes = s.getBytes();

這段代碼在不同的平臺上運行得到結(jié)果是不一樣的。由于沒有指定編碼方式,所以在該方法對字符串進(jìn)行編碼的時候就會使用系統(tǒng)的默認(rèn)編碼方式,比如在中文操作系統(tǒng)中可能會使用GBK或者GB2312進(jìn)行編碼,在英文操作系統(tǒng)中有可能使用iso-8859-1進(jìn)行編碼。這樣寫出來的代碼就和機器環(huán)境有很強的關(guān)聯(lián)性了,所以,為了避免不必要的麻煩,我們要指定編碼方式。如使用以下方式:

比較方法
boolean equals(Object anObject);
boolean contentEquals(StringBuffer sb);
boolean contentEquals(CharSequence cs);
boolean equalsIgnoreCase(String anotherString); //使用toUpperCase方法轉(zhuǎn)換成大寫,在進(jìn)行比較
int compareTo(String anotherString);
int compareToIgnoreCase(String str);
boolean regionMatches(int toffset, String other, int ooffset,int len);  //局部匹配
boolean regionMatches(boolean ignoreCase, int toffset,String other, int ooffset, int len);   //局部匹配
String s = "你好,世界!"; 
byte[] bytes = s.getBytes("utf-8");
其他
ength(); //返回字符串長度

isEmpty(); //返回字符串是否為空

charAt(int index;) //返回字符串中第(index+1)個字符

char[] toCharArray(); //轉(zhuǎn)化成字符數(shù)組

trim();// 去掉兩端空格

toUpperCase();// 轉(zhuǎn)化為大寫

toLowerCase();// 轉(zhuǎn)化為小寫

String concat(String str); //拼接字符串

String replace(char oldChar, char newChar); //將字符串中的oldChar字符換成newChar字符

//以上兩個方法都使用了String(char[] value, boolean share);

boolean matches(String regex); //判斷字符串是否匹配給定的regex正則表達(dá)式

boolean contains(CharSequence s); //判斷字符串是否包含字符序列s

String[] split(String regex, int limit;) //按照字符regex將字符串分成limit份。

String[] split(String regex);

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70401.html

相關(guān)文章

  • java.lang.Integer 源碼深入解讀

    摘要:最近算是比較深入的了解了一下的源碼,就想著寫點東西記錄一下,一來可以加深理解,再來也算是為我刷了那么久平臺貢獻(xiàn)一點自己的綿薄之力。這兩個方法都是給當(dāng)前的實例的屬性賦值,參數(shù)為類型的構(gòu)造器直接將參數(shù)賦值給屬性,參數(shù)為是將方法的返回值賦值。 最近算是比較深入的了解了一下Integer的源碼,就想著寫點東西記錄一下,一來可以加深理解,再來也算是為我刷了那么久segmentfault平臺貢獻(xiàn)一...

    mingzhong 評論0 收藏0
  • React 源碼深度解讀(五):首次自定義組件渲染 - Part 2

    摘要:的和真正有效的都各只有一行代碼的調(diào)用棧如下這中間的函數(shù)調(diào)用邏輯很清晰,最終會走到這里這里的邏輯很簡單,如果不是數(shù)組,則調(diào)用回調(diào)函數(shù)如果是數(shù)組,則繼續(xù)調(diào)用自身,相當(dāng)于深度優(yōu)先遍歷。這里的回調(diào)函數(shù)就是中的這里直接調(diào)用,創(chuàng)建。 前言 React 是一個十分龐大的庫,由于要同時考慮 ReactDom 和 ReactNative ,還有服務(wù)器渲染等,導(dǎo)致其代碼抽象化程度很高,嵌套層級非常深,閱讀...

    william 評論0 收藏0
  • 關(guān)于JustWriting源碼的一些解讀

    摘要:文件名以在文件系統(tǒng)中的排序返回。將包含完整模式匹配到的文本將包含第一個捕獲子組匹配到的文本,以此類推。其實主要是是記錄一下自己的筆錄,不過還是強烈推薦大家上手,從此寫博客就不是什么難事了。 JustWriting是一個用PHP,基于CI框架的極簡主義博客系統(tǒng),在這里,你甚至不需要數(shù)據(jù)庫,直接用Markdown寫博客就可以了,就像我此刻一樣,直接用Mou來寫這篇博客分享一樣,So eas...

    booster 評論0 收藏0
  • jQuery源碼解讀:部份jQuery工具方法實現(xiàn)

    摘要:作為前端最流行的類庫,沒有之一,源碼必須得讀一讀。本博將不定期更新源碼解讀內(nèi)容,如果解讀不正確的地方,還請同學(xué)們在評論中指正。這里使用的是改變的指向為實例。其實就是中常見的四判斷是否是數(shù)字函數(shù)用于檢查其參數(shù)是否是無窮大。 jQuery作為前端最流行的類庫,沒有之一,源碼必須得讀一讀。本博將不定期更新源碼解讀內(nèi)容,如果解讀不正確的地方,還請同學(xué)們在評論中指正。 本系列文章基于jquer...

    Rindia 評論0 收藏0
  • Java IO框架總攬--File源碼解讀

    摘要:直接繼承與,實現(xiàn)了接口和接口,實現(xiàn)接口,意味著對象支持序列化操作,而實現(xiàn)接口,意味著之間可以比較大小。刪除此抽象路徑名表示的文件或目錄。標(biāo)記此抽象路徑名指定的文件或目錄,從而只能對其進(jìn)行讀操作。 showImg(https://segmentfault.com/img/bVbi3ls?w=2048&h=164);1 File直接繼承與Object,實現(xiàn)了Serializable接口和C...

    rubyshen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<