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