From e89d0f67523c532fe9b23908c0d1286ca878642f Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Wed, 28 Oct 2026 22:51:25 +0800 Subject: [PATCH] =?UTF-8?q?Update=20Java=20=E5=AE=B9=E5=99=A8=20-=20?= =?UTF-8?q?=E8=BF=9B=E9=98=B6.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增进阶篇,收录 ArrayList 序列化、HashMap 计算数组容量、ConcurrentHashMap 的 size 操作和 WeakHashMap 缓存示例等源码细节。 --- notes/Java 容器 - 进阶.md | 255 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 notes/Java 容器 - 进阶.md diff --git a/notes/Java 容器 - 进阶.md b/notes/Java 容器 - 进阶.md new file mode 100644 index 00000000..f7b2b5bb --- /dev/null +++ b/notes/Java 容器 - 进阶.md @@ -0,0 +1,255 @@ +# Java 容器 - 进阶 + +* [Java 容器 - 进阶](#java-容器---进阶) + * [三、源码分析](#三源码分析) + * [ArrayList](#arraylist) + * [HashMap](#hashmap) + * [ConcurrentHashMap](#concurrenthashmap) + * [WeakHashMap](#weakhashmap) + * [参考资料](#参考资料) + + + +## 三、源码分析 + +以下源码基于 JDK 1.8,ConcurrentHashMap 的 size 操作基于 JDK 1.7。 + +### ArrayList + +#### 序列化 + +主线见[Java 容器 · ArrayList 的序列化](Java%20容器.md#4-序列化)。 + +ArrayList 基于数组实现,并且具有动态扩容特性,因此保存元素的数组不一定都会被使用,那么就没必要全部进行序列化。 + +保存元素的数组 elementData 使用 transient 修饰,该关键字声明数组默认不会被序列化。 + +```java +transient Object[] elementData; // non-private to simplify nested class access +``` + +ArrayList 实现了 writeObject() 和 readObject() 来控制只序列化数组中有元素填充那部分内容。 + +```java +private void readObject(java.io.ObjectInputStream s) + throws java.io.IOException, ClassNotFoundException { + elementData = EMPTY_ELEMENTDATA; + + // Read in size, and any hidden stuff + s.defaultReadObject(); + + // Read in capacity + s.readInt(); // ignored + + if (size > 0) { + // be like clone(), allocate array based upon size not capacity + ensureCapacityInternal(size); + + Object[] a = elementData; + // Read in all elements in the proper order. + for (int i=0; i