摘要:定義是類(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
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接口,所以支持序列化和反序列化。
構(gòu)造方法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)。
使用字符數(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中的value和hash兩個(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ǔ)的,String 和 char 為內(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)
使用Stringbuider和StringBuffer構(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
摘要:最近算是比較深入的了解了一下的源碼,就想著寫(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)一...
摘要:的和真正有效的都各只有一行代碼的調(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í)非常深,閱讀...
摘要:文件名以在文件系統(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...
摘要:作為前端最流行的類(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...
摘要:直接繼承與,實(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...
閱讀 5019·2021-11-25 09:43
閱讀 1244·2021-11-24 09:38
閱讀 1987·2021-09-30 09:54
閱讀 2881·2021-09-23 11:21
閱讀 2426·2021-09-10 10:51
閱讀 2436·2021-09-03 10:45
閱讀 1222·2019-08-30 15:52
閱讀 1819·2019-08-30 14:13