Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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

‎ch16/03_SortedMap_and_NavigableMap.md

Lines changed: 56 additions & 39 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /