簡體   English   中英

為什么 ArrayList 大小字段不是瞬態的?

[英]Why is the ArrayList size field not transient?

Java 的ArrayList使用自定義序列化並顯式寫入size 然而,大小沒有在ArrayList中標記為transient 為什么 size 寫了兩次:一次是通過defaultWriteObject ,另一次是 vis writeInt(size) ,如下所示( writeObject方法)?

s.defaultWriteObject();

// Write out size as capacity for behavioral compatibility with clone()
s.writeInt(size);

// Write out all elements in the proper order.
for (int i=0; i<size; i++) {
    s.writeObject(elementData[i]);
}

長話短說

它的存在僅僅是為了與舊的 java 版本兼容。

細節

如果您查看s.writeInt(size)上面的注釋,您會發現這應該是容量。 在之前的 java 版本中, ArrayList的序列化形式具有大小和容量。

它們都代表ArrayList的實際屬性。 size表示ArrayList中的項數,而capacity是指在不需要重新創建數組的情況下其中可能的項數(數組的長度)。

如果您查看readObject ,您會發現容量被忽略了:

// Read in capacity
s.readInt(); // ignored

這是因為它在以前的 java 版本中使用,仍然需要寫入/讀取以保持兼容性。

如果您查看匹配的 JDK6 源代碼,您會發現這實際上是以前使用過的。 如果你有一個序列化的 JDK6 ArrayList並嘗試用更新的 JDK 反序列化它,它會起作用。 但是,如果剛剛跳過容量,這將失敗,並且您無法使用舊版本中的ArrayList反序列化任何內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM