|
7 | 7 | }
|
8 | 8 | ```
|
9 | 9 |
|
10 |
| -根据参数是小于,等于还是大于给定对象,`compareTo` 方法返回一个负值,零值或正值。 当一个类实现 `Comparable` 时,由该接口指定的顺序被称为该类的自然顺序。 |
| 10 | +根据参数是小于,等于还是大于给定对象,`compareTo` 方法返回一个负值,零值或正值。 当一个类实现 `Comparable` 时,由该接口指定的顺序被称为该类的自然顺 |
| 11 | +序。 |
11 | 12 |
|
12 | 13 | 通常,属于类的对象只能与属于同一类的对象进行比较。 例如,`Integer` 实现了 `Comparable <Integer>`:
|
13 | 14 |
|
|
55 | 56 |
|
56 | 57 | 在这种情况下,我们说自然顺序与平等一致。
|
57 | 58 |
|
58 |
| -建议您在设计课程时选择与平等一致的自然排序。如果在集合框架中使用接口 `SortedSet` 或 `SortedMap`,这两个函数使用自然排序来比较项目,这一点尤其重要。如果两个比较相同的项目被添加到一个有序集合中,则只有一个将被存储,即使这两个项目不相等;排序地图也是如此。 (您也可以使用第3.4节中描述的比较器指定不同的排序以用于排序集合或排序映射;但在这种情况下,指定排序应该再次与等号一致)。 |
| 59 | +建议您在设计课程时选择与平等一致的自然排序。如果在集合框架中使用接口 `SortedSet` 或 `SortedMap`,这两个函数使用自然排序来比较项目,这一点尤其重要。 |
| 60 | +如果两个比较相同的项目被添加到一个有序集合中,则只有一个将被存储,即使这两个项目不相等;排序地图也是如此。 (您也可以使用第3.4节中描述的比较器指定不同 |
| 61 | +的排序以用于排序集合或排序映射;但在这种情况下,指定排序应该再次与等号一致)。 |
59 | 62 |
|
60 |
| -`Java` 核心库中几乎每个具有自然排序的类都与 `equals` 相一致。 `java.math.BigDecimal` 是一个例外,它将具有相同值但精度不同的两个小数进行比较,例如 `4.0` 和 `4.00`。 `3.3` 节给出了另一个与自然顺序不相等的类的例子。 |
| 63 | +`Java` 核心库中几乎每个具有自然排序的类都与 `equals` 相一致。 `java.math.BigDecimal` 是一个例外,它将具有相同值但精度不同的两个小数进行比较,例如 |
| 64 | +`4.0` 和 `4.00`。 `3.3` 节给出了另一个与自然顺序不相等的类的例子。 |
61 | 65 |
|
62 |
| -比较不同于平等,因为它不接受空参数。 如果 `x` 不为空,则为 `x.equals(null)` 必须返回 `false`,而 `x.compareTo(null)` 必须抛出 `NullPointerException`。 |
| 66 | +比较不同于平等,因为它不接受空参数。 如果 `x` 不为空,则为 `x.equals(null)` 必须返回 `false`,而 `x.compareTo(null)` 必须抛出 |
| 67 | +`NullPointerException`。 |
63 | 68 |
|
64 |
| -我们使用标准成语进行比较,写入 `x.compareTo(y)<0` 而不是 `x <y`,并且写入 `x.compareTo(y)<= 0 `而不是 `x <= y`。 使用其中的最后一个,甚至在诸如 `java.math.BigDecimal之` 类的类型上自然排序与 `equals` 不一致是非常明智的。 |
| 69 | +我们使用标准成语进行比较,写入 `x.compareTo(y)<0` 而不是 `x <y`,并且写入 `x.compareTo(y)<= 0 `而不是 `x <= y`。 使用其中的最后一个,甚至在诸如 |
| 70 | +`java.math.BigDecimal之` 类的类型上自然排序与 `equals` 不一致是非常明智的。 |
65 | 71 |
|
66 |
| -**可比契约** `Comparable <T>` 接口的契约指定了三个属性。 这些属性是使用符号函数定义的,函数的定义使得 `sgn(x)` 返回 `-1`,`0` 或 `1`,具体取决于 `x` 是负数,零还是正数。 |
| 72 | +**可比契约** `Comparable <T>` 接口的契约指定了三个属性。 这些属性是使用符号函数定义的,函数的定义使得 `sgn(x)` 返回 `-1`,`0` 或 `1`,具体取决于 |
| 73 | +`x` 是负数,零还是正数。 |
67 | 74 |
|
68 | 75 | 首先,比较是反对称的。 颠倒参数的顺序颠倒了结果:
|
69 | 76 |
|
|
87 | 94 | if x.compareTo(y) == 0 then sgn(x.compareTo(z)) == sgn(y.compareTo(z))
|
88 | 95 | ```
|
89 | 96 |
|
90 |
| -这概括了数字的属性:如果 `x == y`,那么 `x <z` 当且仅当 `y <z`。 据推测,如果 `x.compareTo(y)== 0`,那么 `x.compareTo(z)` 会引发异常,当且仅当 `y.compareTo(z)`引发异常时,也需要这样做,尽管没有明确说明。 |
| 97 | +这概括了数字的属性:如果 `x == y`,那么 `x <z` 当且仅当 `y <z`。 据推测,如果 `x.compareTo(y)== 0`,那么 `x.compareTo(z)` 会引发异常,当且仅当 |
| 98 | +`y.compareTo(z)`引发异常时,也需要这样做,尽管没有明确说明。 |
91 | 99 |
|
92 | 100 | 强烈建议比较与平等兼容:
|
93 | 101 |
|
|
120 | 128 | }
|
121 | 129 | ```
|
122 | 130 |
|
123 |
| -条件表达式根据接收方是小于,等于还是大于参数返回 `-1`,`0` 或 `1`。 你可能会认为下面的代码也会起作用,因为如果接收者小于参数,该方法被允许返回任何负数。 |
| 131 | +条件表达式根据接收方是小于,等于还是大于参数返回 `-1`,`0` 或 `1`。 你可能会认为下面的代码也会起作用,因为如果接收者小于参数,该方法被允许返回任何负 |
| 132 | +数。 |
124 | 133 |
|
125 | 134 | ```java
|
126 | 135 | class Integer implements Comparable<Integer> {
|
|
0 commit comments