小知識點探究——字符串存儲信息

起始

從零開始學的時候,就覺得java是從字符串開始慢慢有難度,慢慢延伸開,慢慢變得難的。
這是因爲java的各種存儲方式可以相互轉換,而且字符串是可以唯一一個保持強轉之前精度的存儲格式。所以它可以根據不同的需要,保存,讀取。而保存和讀取的方法實際上一般都是拆分和組合的方法。所以它非常重要,也是一個基本功。

組裝

字符串的組裝就是對於需要存儲的信息的存儲。這個很簡單,只要把相應的信息強轉成字符串,然後按照約定的方式組合起來就可以了。

強轉成String

那麼,把信息強轉成字符串格式又要怎麼做。這個方法很多,比如說
1.所有類型都可通過加上””來變成字符串,這個道理很簡單,java不同存儲格式的字段相互運算的時候,java爲了儘可能的不丟失精度,會把自動把精度比較低的類型強制轉換成爲精度比較高的存儲格式。但是這種方式並不推薦,因爲它其實是等於定義了兩個String的對象,然後才強制轉換類型,爲了生成新的對象還會再新建一個String對象,一共生成了三個String對象,只是寫着會方便一點而已,多了一些不必要的浪費。
2.Java有封裝和自動裝箱的方式,每一個存儲格式都有它相應的類,類中都有強制轉化的方法,String也不例外。它的方法是String.valueOf(),這個方法可以強轉所有基本類型,甚至是類(當然必須寫toString()方法,因爲這個方法會調用toString())。

組裝起來

按照約定的方法組裝嘛,就看你自己的需要了,其實一般組裝的約定是爲了拆分和分析的方便來的。
其實所謂組裝,只是簡單的字符串拼接,這也有兩種方法
1.還是用String的格式存儲對象,簡單的把需要組裝的字符用“+”號連接,自然就可以拼接在一起了。但是要注意的是,因爲String是定長的,所以每添加一次,就需要新建一個String的對象,這樣會造成大量的資源浪費。
2.使用StringBulider,StringBulider是一個可以變長的String對象(其實是空間溢出的時候纔會新建新的對象),所以會大大減少新建對象的開銷。使用它組合字符串的時候只需要調用它的append()方法就可以了。
3.使用StringBuffer,它和前面的StringBulider比較相似,只是它是線程安全的,因爲線程安全,就多了一些操作,操作效率就會變得低一點。但是如果可能會有線程安全的問題,就需要使用這個方法。

解析

組裝起來的對象是爲了存儲,存儲信息肯定是需要在某個條件下使用的,那麼就必須要存儲好的String信息一步步還原成組裝之前的有用的信息。
這個步奏其實是組裝的逆操作,反着回來就可以了。把字符串拆分,然後根據約定去把數據強制轉回所需要的類型(有時需要做一些類型檢驗)。

拆分

這一步的方法必須依賴組裝的步奏。所以這裏的所有東西都是依賴在組裝的時候符合相應的約定的前提下的。
字符串的拆分有很多種方法
1.String中的toCharArray()方法,這個方法返回一個char數組,把String的每一個字符都轉換成char格式放入這個數組中,數組的下標就是這個字符在String中出現的位置。這個方法的好處是不浪費空間(任何一個字符都有作用),又非常簡單(只需一個方法就可以了)。但是這個方法也有幾個很大的缺陷:每條信息的存儲格式大小有限(一個字符),當然也可以有方法組裝成幾個字符但是需要比較繁瑣的操作,不如用其他方法;信息強轉成其他格式會遇到一些比較棘手的問題(char轉成其他格式會變成字符相應的ASCII編碼格式相應的數字)。
2.String中的split()方法 ,這個方法需要在不同的信息中間加入相應的分隔符,然後這個方法分割的時候會返回一個分割之後的String數組。這個方法需要花費一些開銷(組裝的時候需要添加分隔符),但是可以靈活多變(可以添加不同的分隔符,不同層次的分割),有待開發,特別是應對複雜對象轉成String格式存儲的時候,可以不同層次用不同的約定(但也加大了拆分錯誤的可能性)。這是推薦使用的方法,它對字符的個數沒有限制,對不信息的格式也沒有任何要求,又靈活多變,所需開銷可以自己想辦法減少。這個方法中,技術操作遠遠不及約定重要,好的約定可以完成很多技術操作完不成的東西。
3.依賴String中的正則表達式來拆分,這個方法的技巧更多,靈活度也更大,因爲正則表達式是可以表達一切信息的格式,可以解決任何問題。而且這種方法和第二個方法並不矛盾,可以交叉使用,互爲補充。但是需要對正則表達式的理解比較充分,對正則表達式的相應符號的關係和不同要明確區分。否則差值毫米,謬之千里。這個方法能應對的問題最廣最深,但是需要對正則表達式理解必須充分。況且,一般需要存儲成String格式的信息可能比較複雜,而且可能可變性要求高,正則表達式雖然都能表示,但是對於不同情況的兼容需要比較多的代碼去協調。這是一個比較複雜的問題,用第二個方法的話只需要很好的約定就可以,所以不太推薦。(正則表達式會限定死格式,並行的正則表達式可以突破這個限定,但是需要過多的代碼)

信息的解讀

僅僅是拆分信息遠遠不夠,還要強轉會原來的格式。這個其實很簡單,每個基本對象都有它相應的封裝類,這個封裝類裏面會有相應的強行轉化的方法。
int對應的封裝類是Integer,相應的方法是Integer.parseInt()
char一般是用數組去存儲信息,可以用new String(char數組名)去生成String對象。
byte也是一般是用數組去存儲信息,可以用new String(byte數組名)去生成String對象。
boolean有它的toString()方法,但是真的需要存儲boolean的信息的,可以約定成其他存儲方式,比如int的0表示false,1表示true。
double和float都有valueOf()方法(Float.valueOf()和Double.valueOf()),通過它可以強制轉化成自己的類型。
如果是數組的話,需要轉化之後遍歷賦值,如果是類的話,可以使用相應的構造方法去初始化。

這樣的話,就可以將信息通過字符串的方式去存儲,然後在需要的時候拿出來拆分,解讀了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章