File tree 1 file changed +5
-41
lines changed
1 file changed +5
-41
lines changed Original file line number Diff line number Diff line change 142
142
```
143
143
144
144
![ ] ( 13_4.png )
145
+
145
146
图` 13-5 ` 。` NavigableSet `
146
147
147
148
这些类似于 ` Deque ` 中同名的方法(参见 ` 14.4 ` 节),并且有助于支持在需要队列功能的应用程序中使用 ` NavigableSet ` 。 例如,在本节中待办事项管理器的版本中,我们可以通过以下方式从列表中获取最高优先级的任务:准备好执行的任务:
213
214
```
214
215
215
216
![ ] ( 13_5.png )
217
+
216
218
图 ` 13-6 ` 。一个有序的,平衡的二叉树
217
219
218
220
如果迭代处理涉及对集合的结构更改,并且正在使用的实现是 ` TreeSet ` (它具有快速迭代器),那么我们将不得不使用显式迭代器来避免 ` ConcurrentModificationException ` :
235
237
在计算中,树是代表层次结构的分支结构。计算机树从系谱树中借用了很多术语,虽然有一些差异;最重要的是,在计算树中,每个节点只有一个父节点(除了没有的根节点)。在计算中经常使用的一类重要的树是二叉树 - 每个节点最多可以有两个孩子。图13-6显示了一个按照字母顺序包含这个句子的单词的二叉树的例子。
236
238
237
239
![ ] ( 13_6.png )
240
+
238
241
图 ` 13-7 ` 。 一个不平衡的二叉树
239
242
240
243
如果您查看任何非叶节点(例如,包含以下单词的节点),则可以看到此树的最重要属性:左侧下方的所有节点都包含按字母顺序排列的单词,右侧的所有单词随之而来。要找到一个单词,您需要逐级开始,逐级下降,在每个级别进行字母比较,因此检索或插入元素的成本与树的深度成正比。
282
285
### ConcurrentSkipListSet
283
286
284
287
![ ] ( 13_7.png )
288
+
285
289
图 ` 13-8 ` 。 修改链接列表
286
290
287
291
![ ] ( 13_8.png )
292
+
288
293
图 ` 13-9 ` 。 搜索跳过列表
289
294
290
295
` ConcurrentSkipListSet ` 作为第一个并发集合实现在 ` Java 6 ` 中引入。它由跳过列表支持,跳过列表是上一节二叉树的现代替代方案。一个集合的跳过列表是一系列链表,每个链表都是由两个字段组成的一连串单元格:一个用于保存一个值,另一个用于保存对下一个单元格的引用。通过指针重新排列,元素在常量时间内插入和移出链表,如图 ` 13-8 ` 部分(` a ` )和(` b ` )所示。
311
316
在 ` EnumSet ` 实现中,对于多于 ` 64 ` 个值的枚举类型,下一个最坏情况下的复杂度为 ` O(log m) ` ,其中 ` m ` 是枚举中元素的数量。
312
317
313
318
314
-
315
-
316
-
317
-
318
-
319
-
320
-
321
-
322
-
323
-
324
-
325
-
326
-
327
-
328
-
329
-
330
-
331
-
332
-
333
-
334
-
335
-
336
-
337
-
338
-
339
-
340
-
341
-
342
-
343
-
344
-
345
-
346
-
347
-
348
-
349
-
350
-
351
-
352
-
353
-
354
-
You can’t perform that action at this time.
0 commit comments