摘要:是表明該數(shù)據(jù)不參與序列化。使用對(duì)象序列化,在保存對(duì)象時(shí),會(huì)把其狀態(tài)保存為一組字節(jié),在未來(lái),再將這些字節(jié)組裝成對(duì)象。有了這個(gè)標(biāo)記的就能被序列化機(jī)制處理。
雖是讀書筆記,但是如轉(zhuǎn)載請(qǐng)注明出處 http://segmentfault.com/blog/exploring/
.. 拒絕伸手復(fù)制黨
在閱讀HashMap和TreeMap的源碼過(guò)程中,發(fā)現(xiàn)了一個(gè)奇怪的事情: 這些類執(zhí)行了Serializable接口,卻在關(guān)鍵地方,比如hashmap將存儲(chǔ)數(shù)據(jù)的table 數(shù)組聲明為transient. 這是何意?
stackoverflow 查了一下,大概有兩個(gè)原因。
1.transient 是表明該數(shù)據(jù)不參與序列化。因?yàn)?HashMap 中的存儲(chǔ)數(shù)據(jù)的數(shù)組數(shù)據(jù)成員中,數(shù)組還有很多的空間沒(méi)有被使用,沒(méi)有被使用到的空間被序列化沒(méi)有意義。所以需要手動(dòng)使用 writeObject() 方法,只序列化實(shí)際存儲(chǔ)元素的數(shù)組。
2. 由于不同的虛擬機(jī)對(duì)于相同 hashCode 產(chǎn)生的 Code 值可能是不一樣的,如果你使用默認(rèn)的序列化,那么反序列化后,元素的位置和之前的是保持一致的,可是由于 hashCode 的值不一樣了,那么定位函數(shù) indexFor()返回的元素下標(biāo)就會(huì)不同,這樣不是我們所想要的結(jié)果.
對(duì)象 ----- 字節(jié)流 ----- 文件
什么是對(duì)象序列化:
Java 平臺(tái)允許我們?cè)趦?nèi)存中創(chuàng)建可復(fù)用的 Java 對(duì)象,但一般情況下,只有當(dāng) JVM 處于運(yùn)行時(shí),這些對(duì)象才可能存在,即,這些對(duì)象的生命周期不會(huì)比 JVM 的生命周期更長(zhǎng)。但在現(xiàn)實(shí)應(yīng)用中,就可能要求在 JVM 停止運(yùn)行之后能夠保存 (持久化) 指定的對(duì)象,并在將來(lái)重新讀取被保存的對(duì)象。Java 對(duì)象序列化就能夠幫助我們實(shí)現(xiàn)該功能。 使用 Java 對(duì)象序列化,在保存對(duì)象時(shí),會(huì)把其狀態(tài)保存為一組字節(jié),在未來(lái),再將這些字節(jié)組裝成對(duì)象。必須注意地是,對(duì)象序列化保存的是對(duì)象的 "狀態(tài)",即它的成員變量。由此可知,對(duì)象序列化不會(huì)關(guān)注類中的靜態(tài)變量。 除了在持久化對(duì)象時(shí)會(huì)用到對(duì)象序列化之外,當(dāng)使用 RMI(遠(yuǎn)程方法調(diào)用),或在網(wǎng)絡(luò)中傳遞對(duì)象時(shí),都會(huì)用到對(duì)象序列化。 一個(gè)對(duì)象能夠序列化的前提是實(shí)現(xiàn)`Serializable`接口, `Serializable` 接口沒(méi)有方法,更像是個(gè)標(biāo)記。有了這個(gè)標(biāo)記的 Class 就能被序列化機(jī)制處理。使用 `ObjectInputStream` 和 `ObjectOutputStream` 進(jìn)行對(duì)象的讀寫。
class User implements Serializable{ private static final long serialVersionUID = 201322060620L; private String username; private transient String passwd; public String getUsername(){ return username; } public void setUsername(String username){ this.username = username; } public String getPasswd(){ return this.passwd; } public void setPasswd(String passwd){ this.passwd = passwd; } } public class TransientTest { public static void main(String[] args) { // TODO Auto-generated method stub User user = new User(); user.setUsername("GSM"); user.setPasswd("1010"); System.out.println("read before Serializable: "); System.out.println("username: " + user.getUsername()); System.err.println("password: " + user.getPasswd()); try{ ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("F:/user.txt")); os.writeObject(user);//將User對(duì)象寫入文件 os.flush(); os.close(); }catch(FileNotFoundException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } try { ObjectInputStream is = new ObjectInputStream( new FileInputStream( "F:/user.txt")); user = (User) is.readObject(); // 從流中讀取User的數(shù)據(jù) is.close(); System.out.println(" read after Serializable: "); System.out.println("username: " + user.getUsername()); System.err.println("password: " + user.getPasswd()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
user.txt 即 user對(duì)象保存到文件的內(nèi)容是二進(jìn)制的串,16進(jìn)制查看:
文件一共63B
想更一進(jìn)步的支持我,請(qǐng)掃描下方的二維碼,你懂的~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64308.html
摘要:簡(jiǎn)介是的線程安全版本,內(nèi)部也是通過(guò)數(shù)組實(shí)現(xiàn),每次對(duì)數(shù)組的修改都完全拷貝一份新的數(shù)組來(lái)修改,修改完了再替換掉老數(shù)組,這樣保證了只阻塞寫操作,不阻塞讀操作,實(shí)現(xiàn)讀寫分離。 簡(jiǎn)介 CopyOnWriteArrayList是ArrayList的線程安全版本,內(nèi)部也是通過(guò)數(shù)組實(shí)現(xiàn),每次對(duì)數(shù)組的修改都完全拷貝一份新的數(shù)組來(lái)修改,修改完了再替換掉老數(shù)組,這樣保證了只阻塞寫操作,不阻塞讀操作,實(shí)現(xiàn)讀寫...
摘要:刪除元素作為雙端隊(duì)列,刪除元素也有兩種方式,一種是隊(duì)列首刪除元素,一種是隊(duì)列尾刪除元素。作為,又要支持中間刪除元素,所以刪除元素一個(gè)有三個(gè)方法,分別如下。在中間刪除元素比較低效,首先要找到刪除位置的節(jié)點(diǎn),再修改前后指針,時(shí)間復(fù)雜度為。 介紹 LinkedList是一個(gè)以雙向鏈表實(shí)現(xiàn)的List,它除了作為L(zhǎng)ist使用,還可以作為隊(duì)列或者棧來(lái)使用,它是怎么實(shí)現(xiàn)的呢?讓我們一起來(lái)學(xué)習(xí)吧。 繼...
摘要:加載因子是哈希表在其容量自動(dòng)增加之前可以達(dá)到多滿的一種尺度。當(dāng)哈希表中的條目數(shù)超出了加載因子與當(dāng)前容量的乘積時(shí),則要對(duì)該哈希表進(jìn)行操作即重建內(nèi)部數(shù)據(jù)結(jié)構(gòu),從而哈希表將具有大約兩倍的桶數(shù)。成員變量每個(gè)對(duì)由封裝,存在了對(duì)象數(shù)組中。 雖是讀書筆記,但是如轉(zhuǎn)載請(qǐng)注明出處 http://segmentfault.com/blog/exploring/ .. 拒絕伸手復(fù)制黨 LinkedLis...
摘要:源碼解析屬性雙向鏈表頭節(jié)點(diǎn)雙向鏈表尾節(jié)點(diǎn)是否按訪問(wèn)順序排序雙向鏈表的頭節(jié)點(diǎn),舊數(shù)據(jù)存在頭節(jié)點(diǎn)。雙向鏈表的尾節(jié)點(diǎn),新數(shù)據(jù)存在尾節(jié)點(diǎn)。內(nèi)部類位于中位于中存儲(chǔ)節(jié)點(diǎn),繼承自的類,用于單鏈表存儲(chǔ)于桶中,和用于雙向鏈表存儲(chǔ)所有元素。 簡(jiǎn)介 LinkedHashMap內(nèi)部維護(hù)了一個(gè)雙向鏈表,能保證元素按插入的順序訪問(wèn),也能以訪問(wèn)順序訪問(wèn),可以用來(lái)實(shí)現(xiàn)LRU緩存策略。 LinkedHashMap可以看...
摘要:源碼分析默認(rèn)容量默認(rèn)容量為,也就是通過(guò)創(chuàng)建時(shí)的默認(rèn)容量。集合中元素的個(gè)數(shù)真正存儲(chǔ)元素的個(gè)數(shù),而不是數(shù)組的長(zhǎng)度。方法刪除指定元素值的元素,時(shí)間復(fù)雜度為。方法求兩個(gè)集合的交集。 簡(jiǎn)介 ArrayList是一種以數(shù)組實(shí)現(xiàn)的List,與數(shù)組相比,它具有動(dòng)態(tài)擴(kuò)展的能力,因此也可稱之為動(dòng)態(tài)數(shù)組。 繼承體系 showImg(https://segmentfault.com/img/bVbv8Ow?w...
閱讀 1093·2021-10-12 10:11
閱讀 877·2019-08-30 15:53
閱讀 2286·2019-08-30 14:15
閱讀 2961·2019-08-30 14:09
閱讀 1197·2019-08-29 17:24
閱讀 972·2019-08-26 18:27
閱讀 1283·2019-08-26 11:57
閱讀 2146·2019-08-23 18:23