Skip to content

Commit efbe42e

Browse files
authored
🎨
1 parent 89e263c commit efbe42e

File tree

1 file changed

+56
-39
lines changed

1 file changed

+56
-39
lines changed

Diff for: ch16/03_SortedMap_and_NavigableMap.md

+56-39
Original file line numberDiff line numberDiff line change
@@ -7,115 +7,132 @@
77

88
`16-5` SortedMap
99

10-
`SortedSet` 一样,子接口 `SortedMap`(参见图 `16-5`)增加了它的合约,保证其迭代器将按照升序键顺序遍历映射。它的定义类似于 `SortedSet` 的定义,`firstKey``headMap` 方法对应于 `SortedSet` 方法 `first``headSet`。同 `SortedSet` 一样,`SortedMap` 接口已经在 `Java 6` 中通过子接口 `NavigableMap` 进行了扩展(参见图 `16-6`)。由于相同的原因,此部分的结构类似于第 `13.2` 节:`SortedMap` 已被 `NavigableMap` 过时,但可能有帮助对于目前阻止开发人员使用 `Java 6` 来分别处理两个接口。
10+
`SortedSet` 一样,子接口 `SortedMap`(参见图 `16-5`)增加了它的合约,保证其迭代器将按照升序键顺序遍历映射。它的定义类似于 `SortedSet` 的定义,
11+
`firstKey``headMap` 方法对应于 `SortedSet` 方法 `first``headSet`。同 `SortedSet` 一样,`SortedMap` 接口已经在 `Java 6` 中通过子接口
12+
`NavigableMap` 进行了扩展(参见图 `16-6`)。由于相同的原因,此部分的结构类似于第 `13.2` 节:`SortedMap` 已被 `NavigableMap` 过时,但可能有帮助对
13+
于目前阻止开发人员使用 `Java 6` 来分别处理两个接口。
1114

12-
`SortedMap` 对其按键进行排序,无论是自然排序还是比较器排序;但无论哪种情况,比较方法都必须与 `equals` 相一致,因为 `SortedMap` 将使用比较来确定密钥何时已经位于地图中。
15+
`SortedMap` 对其按键进行排序,无论是自然排序还是比较器排序;但无论哪种情况,比较方法都必须与 `equals` 相一致,因为 `SortedMap` 将使用比较来确定密钥
16+
何时已经位于地图中。
1317

1418
`SortedMap` 接口定义的额外方法分为三组:
1519

1620
**获取第一个和最后一个要素**
1721

1822
```java
19-
K firstKey()
20-
K lastKey()
23+
K firstKey()
24+
K lastKey()
2125
```
2226

2327
如果该集合为空,则这些操作会引发 `NoSuchElementException`
2428

2529
**检索比较器**
2630

2731
```java
28-
Comparator<? super K> comparator()
32+
Comparator<? super K> comparator()
2933
```
3034

3135
此方法返回映射的键比较器(如果它已被赋予),而不是依赖于键的自然排序。 否则,它返回 `null`
3236

3337
**查找子序列**
3438

3539
```java
36-
SortedMap<K,V> subMap(K fromKey, K toKey)
37-
SortedMap<K,V> headMap(K toKey)
38-
SortedMap<K,V> tailMap(K fromKey)
40+
SortedMap<K,V> subMap(K fromKey, K toKey)
41+
SortedMap<K,V> headMap(K toKey)
42+
SortedMap<K,V> tailMap(K fromKey)
3943
```
4044

41-
这些操作就像 `SortedSet` 中的相应操作一样:关键参数本身不必存在于映射中,并且返回的集合包含 `fromKey` - 如果实际上它存在于映射中 - 并且不包含 `toKey`
45+
这些操作就像 `SortedSet` 中的相应操作一样:关键参数本身不必存在于映射中,并且返回的集合包含 `fromKey` - 如果实际上它存在于映射中 - 并且不包含
46+
`toKey`
4247

4348
### NavigableMap
4449

4550
![](16_6.png)
4651

4752
`16-6` NavigableMap
4853

49-
`NavigableMap`(参见图 `16-6` )扩展并替换 `SortedMap`,就像 `NavigableSet` 替换 `SortedSet` 一样。 其方法几乎与 `NavigableSet` 的方法完全一致,将地图视为一组由 `Map.Entry` 对象表示的键值关联。 因此,当 `NavigableSet` 方法返回该集合的元素时,相应的 `NavigableMap` 方法将返回 `Map.Entry` 类型的结果。 到目前为止,这种类型的对象只能通过遍历由 `Map.entrySet` 返回的集合来获得,并且在映射的并发修改面前被指定为无效。该规范不适用于新方法返回的 `Map.Entry` 对象,`NavigableMap` 的契约通过指定由其方法返回的 `Map.Entry` 对象是反映地图在生成时的状态的快照对象,并且不支持 `setValue`
54+
`NavigableMap`(参见图 `16-6` )扩展并替换 `SortedMap`,就像 `NavigableSet` 替换 `SortedSet` 一样。 其方法几乎与 `NavigableSet` 的方法完全一
55+
致,将地图视为一组由 `Map.Entry` 对象表示的键值关联。 因此,当 `NavigableSet` 方法返回该集合的元素时,相应的 `NavigableMap` 方法将返回
56+
`Map.Entry` 类型的结果。 到目前为止,这种类型的对象只能通过遍历由 `Map.entrySet` 返回的集合来获得,并且在映射的并发修改面前被指定为无效。该规范不适
57+
用于新方法返回的 `Map.Entry` 对象,`NavigableMap` 的契约通过指定由其方法返回的 `Map.Entry` 对象是反映地图在生成时的状态的快照对象,并且不支持
58+
`setValue`
5059

5160
`NavigableMap` 添加的方法可以分为四组。
5261

5362
**获取第一个和最后一个要素**
5463

5564
```java
56-
Map.Entry<K,V> pollFirstEntry()
57-
Map.Entry<K,V> pollLastEntry()
58-
Map.Entry<K,V> firstEntry()
59-
Map.Entry<K,V> lastEntry()
65+
Map.Entry<K,V> pollFirstEntry()
66+
Map.Entry<K,V> pollLastEntry()
67+
Map.Entry<K,V> firstEntry()
68+
Map.Entry<K,V> lastEntry()
6069
```
6170

62-
前两种方法类似于 `NavigableSet` 中的 `pollFirst``pollLast`。后两个是因为 `NavigableMap` 中关于使地图条目可用的重点需要与从 `SortedMap` 继承的第一个和最后一个密钥返回方法相对应的入口返回方法。
71+
前两种方法类似于 `NavigableSet` 中的 `pollFirst``pollLast`。后两个是因为 `NavigableMap` 中关于使地图条目可用的重点需要与从 `SortedMap` 继承
72+
的第一个和最后一个密钥返回方法相对应的入口返回方法。
6373

6474
**获取范围视图**
6575

6676
```java
67-
NavigableMap<K,V> subMap(
68-
K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
69-
NavigableMap<K,V> headMap(K toKey, boolean inclusive)
70-
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)
77+
NavigableMap<K,V> subMap(
78+
K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
79+
NavigableMap<K,V> headMap(K toKey, boolean inclusive)
80+
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)
7181
```
7282

73-
`NavigableSet` 方法一样,这些方法比 `SortedMap` 的范围视图方法提供了更大的灵活性。 这些方法不是总是返回一个半开的间隔,而是接受用于确定是否包含定义间隔的一个或多个键的布尔参数。
83+
`NavigableSet` 方法一样,这些方法比 `SortedMap` 的范围视图方法提供了更大的灵活性。 这些方法不是总是返回一个半开的间隔,而是接受用于确定是否包含
84+
定义间隔的一个或多个键的布尔参数。
7485

7586
**获得最接近的比赛**
7687

7788
```java
78-
Map.Entry<K,V> ceilingEntry(K Key)
79-
K ceilingKey(K Key)
80-
Map.Entry<K,V> floorEntry(K Key)
81-
K floorKey(K Key)
82-
Map.Entry<K,V> higherEntry(K Key)
83-
K higherKey(K Key)
84-
Map.Entry<K,V> lowerEntry(K Key)
85-
K lowerKey(K Key)
89+
Map.Entry<K,V> ceilingEntry(K Key)
90+
K ceilingKey(K Key)
91+
Map.Entry<K,V> floorEntry(K Key)
92+
K floorKey(K Key)
93+
Map.Entry<K,V> higherEntry(K Key)
94+
K higherKey(K Key)
95+
Map.Entry<K,V> lowerEntry(K Key)
96+
K lowerKey(K Key)
8697
```
8798

88-
这些与 `NavigableSet` 的相应最接近匹配方法类似,但它们返回 `Map.Entry` 对象。 如果您想要属于这些条目之一的密钥,请使用相应的便捷键返回方法,同时允许地图避免不必要的创建 `Map.Entry` 对象的性能优势。
99+
这些与 `NavigableSet` 的相应最接近匹配方法类似,但它们返回 `Map.Entry` 对象。 如果您想要属于这些条目之一的密钥,请使用相应的便捷键返回方法,同时允
100+
`Map` 避免不必要的创建 `Map.Entry` 对象的性能优势。
89101

90102
**浏览 Map**
91103

92104
```java
93-
NavigableMap<K,V> descendingMap() // 返回 Map 的逆序视图
94-
NavigableSet<K> descendingKeySet() // 返回一个反序键集
105+
NavigableMap<K,V> descendingMap() // 返回 Map 的逆序视图
106+
NavigableSet<K> descendingKeySet() // 返回一个反序键集
95107
```
96108

97109
还有一个新的方法被定义为获得键的 `NavigableSet`
98110

99111
```java
100-
NavigableSet<K> navigableKeySet() // 返回一个前向顺序键集
112+
NavigableSet<K> navigableKeySet() // 返回一个前向顺序键集
101113
```
102114

103-
您可能想知道为什么从 `Map` 继承的方法 `keySet` 不能简单地使用协变返回类型来重写,以返回 `NavigableSet`。 事实上,`NavigableMap.keySet` 的平台实现返回一个 `NavigableSet`。但是存在一个兼容性问题:如果 `TreeMap.keySet` 的返回类型从 `Set` 更改为 `NavigableSet`,则覆盖该方法的任何现有 `TreeMap` 子类现在将无法编译,除非它们也更改了返回类型。(这一点与 `8.4` 节中讨论的相似。)
115+
您可能想知道为什么从 `Map` 继承的方法 `keySet` 不能简单地使用协变返回类型来重写,以返回 `NavigableSet`。 事实上,`NavigableMap.keySet` 的平台实
116+
现返回一个 `NavigableSet`。但是存在一个兼容性问题:如果 `TreeMap.keySet` 的返回类型从 `Set` 更改为 `NavigableSet`,则覆盖该方法的任何现有
117+
`TreeMap` 子类现在将无法编译,除非它们也更改了返回类型。(这一点与 `8.4` 节中讨论的相似。)
104118

105119
### TreeMap
106120

107-
`SortedMap` 是通过 `TreeMap` 在集合框架中实现的。 当我们讨论 `TreeSet` 时,我们遇到了树作为存储元素的数据结构(请参阅第 `13.2.2` 节)。 实际上,`TreeSet` 的内部表示只是一个 `TreeMap`,其中每个键都与相同的标准值相关联,因此第 `13.2.2` 节中给出的红黑树的机制和性能的解释同样适用于此处。
121+
`SortedMap` 是通过 `TreeMap` 在集合框架中实现的。 当我们讨论 `TreeSet` 时,我们遇到了树作为存储元素的数据结构(请参阅第 `13.2.2` 节)。 实际上,
122+
`TreeSet` 的内部表示只是一个 `TreeMap`,其中每个键都与相同的标准值相关联,因此第 `13.2.2` 节中给出的红黑树的机制和性能的解释同样适用于此处。
108123

109-
`TreeMap` 的构造函数除了标准的构造函数之外,还包括一个允许您提供一个 `Comparator` 的构造函数,另一个允许您从另一个 `SortedMap` 创建一个,同时使用相同的比较器和相同的映射:
124+
`TreeMap` 的构造函数除了标准的构造函数之外,还包括一个允许您提供一个 `Comparator` 的构造函数,另一个允许您从另一个 `SortedMap` 创建一个,同时使用
125+
相同的比较器和相同的映射:
110126

111127
```java
112-
public TreeMap(Comparator<? super K> comparator)
113-
public TreeMap(SortedMap<K, ? extends V> m)
128+
public TreeMap(Comparator<? super K> comparator)
129+
public TreeMap(SortedMap<K, ? extends V> m)
114130
```
115131

116-
请注意,这些构造函数中的第二个与 `TreeSet` 的相应构造函数有类似的问题(请参阅第 `13.2.2` 节),因为标准转换构造函数始终使用键的自然顺序,即使其参数实际上是 `SortedMap`
132+
请注意,这些构造函数中的第二个与 `TreeSet` 的相应构造函数有类似的问题(请参阅第 `13.2.2` 节),因为标准转换构造函数始终使用键的自然顺序,即使其参数
133+
实际上是 `SortedMap`
117134

118135
`TreeMap``TreeSet` 具有相似的性能特征:基本操作(`get``put``remove`)在 `O(log n)` 时间执行)。 集合视图迭代器是快速失败的。
119136

120137
《《《 [下一节](04_ConcurrentMap.md) <br/>
121-
《《《 [返回首页](../README.md)
138+
《《《 [返回首页](../README.md)

0 commit comments

Comments
 (0)