<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>集合 on Tequila's 学习笔记</title><link>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/</link><description>Recent content in 集合 on Tequila's 学习笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>© 2026 Tequila</copyright><atom:link href="https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/index.xml" rel="self" type="application/rss+xml"/><item><title>0. 集合</title><link>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-8a9106ccafb56955/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-8a9106ccafb56955/</guid><description>容器主要包括 Collection 和 Map 两种，Collection 存储着对象的集合，而 Map 存储着键值对(两个对象)的映射表。</description></item><item><title>1. Map</title><link>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-214f51a0dc937608/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-214f51a0dc937608/</guid><description>Map 是一个用于保存键值对(key-value)的接口。Map 中不能包含重复的键；每个键最多只能映射到一个值。
HashMap # put 方法大致的思路为：​
对 key 的 hashCode() 做 hash 计算，然后根据 hash 值再计算 Node 的存储位置;​
如果没有哈希碰撞，直接放到桶里；如果有哈希碰撞，以链表的形式存在桶后。​
如果哈希碰撞导致链表过长(大于等于 TREEIFY_THRESHOLD，数值为 8）并且满足容量大于等于64，就把链表转换成红黑树（“链表树化”是Java8开始做的优化）；如果容量不满足大于等于64的条件，那就触发扩容，扩容会将原来为8的链表节点分散开，缩短链表长度。
Java8: 数据结构采用（数组+链表+红黑树）实现。 线程安全
死循环​ 数据丢失 Hashtable # HashTable基于Dictionary类，而HashMap是基于AbstractMap。Dictionary是任何可以键映射到相应值的类的抽象类，而AbstractMap是基于Map接口的实现，它以减少实现此接口所需的工作。​
HashMap 的 key 和 value 都允许为 null，而 Hashtable 的 key 和 value 都不允许为 null。HashMap 遇到 key 为 null 的时候，调用 putForNullKey 方法进行处理，而对 value 没有处理；Hashtable 遇到 null，直接返回 NullPointerException。​
HashTable是同步的，而HashMap则不是。我们可以看一下源码，HashTable中的几乎所有公共的方法都是synchronized的，而有些方法也是在内部通过synchronized代码来实现的。所以有人一般都建议如果在多线程同步时使用HashTable，而不涉及就使用HashMap
TreeMap # TreeMap 是有序的。它的排序规则是：根据 map 中的 key 的自然语义顺序或提供的比较器（Comparator）的自定义比较顺序。​
TreeMap 不是线程安全的。​
TreeMap底层通过红黑树(Red-Black tree)实现，也就意味着containsKey(), get(), put(), remove()都有着log(n)的时间复杂度。</description></item><item><title>2. List</title><link>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-9c9f5572bc23f05b/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-9c9f5572bc23f05b/</guid><description> ArrayList基于数组实现，支持快速的随机访问，但在插入和删除元素时可能涉及数组的重新分配和拷贝，影响性能。​
LinkedList基于链表实现，支持高效的插入和删除操作，但访问特定索引的元素比较耗时。​
Vector与ArrayList类似，但是线程安全的。
ArrayList # ArrayList 是一个数组队列，相当于动态数组。ArrayList 默认创建时容量为0，第一次添加元素时，才会使用默认初始容量10，继续添加元素时，如果发现容量已满，会自动扩容为原始大小的 1.5 倍。
ArrayList 的 Fail-Fast​ # ArrayList 使用 modCount 来记录结构发生变化的次数。结构发生变化是指添加或者删除至少一个元素的所有操作，或者是调整内部数组的大小，仅仅只是设置元素的值 不算结构发生变化。​
在进行序列化 或 者迭代等操作时，需要比较操作前后 modCount 是否改变，如果发生改变，ArrayList 会抛出 ConcurrentModificationException。
LinkedList #</description></item><item><title>3. Set</title><link>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-e936e3a158e6f043/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-e936e3a158e6f043/</guid><description> HashSet 类 # HashSet 通过继承 AbstractSet 实现了 Set 接口中的骨干方法。​
HashSet 实现了 Cloneable，所以支持克隆。​
HashSet 实现了 Serializable，所以支持序列化。​
HashSet 中存储的元素是无序的。​
HashSet 允许 null 值的元素。​
HashSet 不是线程安全的。
TreeSet 类 # TreeSet 通过继承 AbstractSet 实现了 NavigableSet 接口中的骨干方法。​
TreeSet 实现了 Cloneable，所以支持克隆。​
TreeSet 实现了 Serializable，所以支持序列化。​
TreeSet 中存储的元素是有序的。排序规则是自然顺序或比较器（Comparator）中提供的顺序规则。​
TreeSet 不是线程安全的。
LinkedHashSet 类 # LinkedHashSet 通过继承 HashSet 实现了 Set 接口中的骨干方法。​
LinkedHashSet 实现了 Cloneable，所以支持克隆。​
LinkedHashSet 实现了 Serializable，所以支持序列化。​
LinkedHashSet 中存储的元素是按照插入顺序保存的。​
LinkedHashSet 不是线程安全的。
EnumSet 类 #</description></item><item><title>4. Queue</title><link>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-1ae479d4b571edf9/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://latnx.github.io/docs/notes/d-205f3859abe469be/d-abfc9c2201b07353/d-c162d2e18ee5ca86/n-1ae479d4b571edf9/</guid><description>ArrayDeque # ArrayDeque 是 Deque 的动态数组实现。​
LinkedList # LinkedList 是 Deque 的双向链表实现。​
PriorityQueue # PriorityQueue 是 Deque 的堆实现。​</description></item></channel></rss>