国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java筆記 - transient

zhigoo / 3246人閱讀

摘要:是表明該數(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ù)制黨

一個(gè)問(wèn)題:

在閱讀HashMapTreeMap的源碼過(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é)果.

Java對(duì)象序列化

對(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

相關(guān)文章

  • [學(xué)習(xí)筆記-Java集合-3] List - CopyOnWriteArrayList源碼分析

    摘要:簡(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)讀寫...

    GitCafe 評(píng)論0 收藏0
  • [學(xué)習(xí)筆記-Java集合-2] List - LinkedList源碼分析

    摘要:刪除元素作為雙端隊(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í)吧。 繼...

    novo 評(píng)論0 收藏0
  • Java筆記-容器源碼(持續(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...

    mrli2016 評(píng)論0 收藏0
  • [學(xué)習(xí)筆記-Java集合-5]Map - LinkedHashMap源碼分析

    摘要:源碼解析屬性雙向鏈表頭節(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可以看...

    Lowky 評(píng)論0 收藏0
  • [學(xué)習(xí)筆記-Java集合-1] List - ArrayList源碼分析

    摘要:源碼分析默認(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...

    wind5o 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<