摘要:定義是類型,表示該類不能繼承,同時實現(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
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接口,所以支持序列化和反序列化。
構(gòu)造方法java 的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性。在進(jìn)行反序列化時,JVM會把傳過來的字節(jié)流中的serialVersionUID與本地響應(yīng)實體的serialVersionUID進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,否則就拋出版本不一致的異常(InvalidCastException)。
使用字符數(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中的value和hash兩個屬性直接賦值給目標(biāo)String。
public String(String original) { this.value = original.value; this.hash = original.hash; }
字節(jié)數(shù)組構(gòu)造
char[]字符數(shù)組是以unicode碼來存儲的,String 和 char 為內(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)
使用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();
這段代碼在不同的平臺上運行得到結(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
摘要:最近算是比較深入的了解了一下的源碼,就想著寫點東西記錄一下,一來可以加深理解,再來也算是為我刷了那么久平臺貢獻(xiàn)一點自己的綿薄之力。這兩個方法都是給當(dāng)前的實例的屬性賦值,參數(shù)為類型的構(gòu)造器直接將參數(shù)賦值給屬性,參數(shù)為是將方法的返回值賦值。 最近算是比較深入的了解了一下Integer的源碼,就想著寫點東西記錄一下,一來可以加深理解,再來也算是為我刷了那么久segmentfault平臺貢獻(xiàn)一...
摘要:的和真正有效的都各只有一行代碼的調(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)致其代碼抽象化程度很高,嵌套層級非常深,閱讀...
摘要:文件名以在文件系統(tǒng)中的排序返回。將包含完整模式匹配到的文本將包含第一個捕獲子組匹配到的文本,以此類推。其實主要是是記錄一下自己的筆錄,不過還是強烈推薦大家上手,從此寫博客就不是什么難事了。 JustWriting是一個用PHP,基于CI框架的極簡主義博客系統(tǒng),在這里,你甚至不需要數(shù)據(jù)庫,直接用Markdown寫博客就可以了,就像我此刻一樣,直接用Mou來寫這篇博客分享一樣,So eas...
摘要:作為前端最流行的類庫,沒有之一,源碼必須得讀一讀。本博將不定期更新源碼解讀內(nèi)容,如果解讀不正確的地方,還請同學(xué)們在評論中指正。這里使用的是改變的指向為實例。其實就是中常見的四判斷是否是數(shù)字函數(shù)用于檢查其參數(shù)是否是無窮大。 jQuery作為前端最流行的類庫,沒有之一,源碼必須得讀一讀。本博將不定期更新源碼解讀內(nèi)容,如果解讀不正確的地方,還請同學(xué)們在評論中指正。 本系列文章基于jquer...
摘要:直接繼承與,實現(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...
閱讀 4933·2021-11-25 09:43
閱讀 1186·2021-11-24 09:38
閱讀 1892·2021-09-30 09:54
閱讀 2799·2021-09-23 11:21
閱讀 2366·2021-09-10 10:51
閱讀 2368·2021-09-03 10:45
閱讀 1163·2019-08-30 15:52
閱讀 1766·2019-08-30 14:13