亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

String源碼解讀

zebrayoung / 2250人閱讀

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

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

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

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

屬性
 private final char value[];

final類(lèi)型的字符數(shù)組,用來(lái)存儲(chǔ)字符串的內(nèi)容,因?yàn)楸籪inal修飾,所以String一旦初始化之后是不能被更改的。

  private int hash;

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

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

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

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

構(gòu)造方法

使用字符數(shù)組

當(dāng)使用字符串?dāng)?shù)組創(chuàng)建的時(shí)候,會(huì)用的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)建時(shí),會(huì)將源String中的valuehash兩個(gè)屬性直接賦值給目標(biāo)String。

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

字節(jié)數(shù)組構(gòu)造
char[]字符數(shù)組是以u(píng)nicode碼來(lái)存儲(chǔ)的,Stringchar 為內(nèi)存形式,byte是網(wǎng)絡(luò)傳輸或存儲(chǔ)的序列化形式??梢酝ㄟ^(guò)charset來(lái)解碼指定的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();

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

比較方法
boolean equals(Object anObject);
boolean contentEquals(StringBuffer sb);
boolean contentEquals(CharSequence cs);
boolean equalsIgnoreCase(String anotherString); //使用toUpperCase方法轉(zhuǎn)換成大寫(xiě),在進(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(); //返回字符串長(zhǎng)度

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

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

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

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

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

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

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

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

//以上兩個(gè)方法都使用了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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/70401.html

相關(guān)文章

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

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

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

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

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

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

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

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

    Rindia 評(píng)論0 收藏0
  • Java IO框架總攬--File源碼解讀

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

    rubyshen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<