Skip to content

Commit 2306efe

Browse files
authored
Merge pull request #14 from my-learn/gh-pages-1.0
Gh pages 1.0
2 parents 9ccf267 + a8507ff commit 2306efe

13 files changed

+90
-92
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
* [2.5 数组](hc02/05_Arrays.md#数组)
2727
* [2.6 通配符与类型参数](ch02/06_Wildcards_Versus_Type_Parameters.md#通配符与类型参数)
2828
* [2.7 通配符捕获](ch02/07_Wildcard_Capture.md#通配符捕获)
29+
* [2.8 对通配符的限制](ch02/08_Restrictions_on_Wildcards.md)
30+
* [第三章(集合类)](ch03/00_Comparison_and_Bounds.md)
31+
* [3.1 可比较的](ch03/01_Comparable.md)
32+
* [3.2 集合的最大值](ch03/02_Maximum_of_a_Collection.md)
33+
2934

3035
## PR
3136
提交 PR 前请先确认排版,示例: [中文文案排版](https://github.com/maskleo-doc/chinese-copywriting-guidelines)

ch01/00_Introduction.md

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,21 @@
33

44
## 第一章(简介)
55

6-
`Java` 最新版本中现在对泛型和集合与许多其他新功能有良好的支持,包括装箱和拆箱,新的循环形式,以及接受可变数量参数的函数。我们从一个例子开始说明了这
7-
些。 我们将会看到,将它们相结合是协同的:整数求和。
6+
`Java` 最新版本中现在对泛型和集合与许多其他新功能有良好的支持,包括装箱和拆箱,新的循环形式,以及接受可变数量参数的函数。我们从一个例子开始说明了这些。 我们将会看到,将它们相结合是协同的:整数求和。
87

9-
因此作为我们的座右铭,让我们做一些简单求和:把三个数字一个列表并将它们加在一起。 下面是如何在 `Java` 中使用泛型:  
8+
因此作为我们的座右铭,让我们做一些简单求和:把三个数字一个列表并将它们加在一起。 下面是如何在 `Java` 中使用泛型:
109

1110
```java
1211
List<Integer> ints = Arrays.asList(1,2,3);
1312
int s = 0;
1413
for (int n : ints) {
15-
s += n;
14+
s += n;
1615
}
1716
assert s == 6;
1817
```
19-
 
20-
不需要太多的解释你就可以读懂代码,但是让我们来看看关键特征。接口列表和类数组是集合框架的一部分(都可以在 `java.util` 包中找到)。类型 `List` 现在是
21-
通用的;你写 `List<E>` 以指示具有类型 `E` 的元素的列表。这里我们写 `List<Integer>` 指出列表的元素属于 `Integer` 类,即包装类对应于基本类型`int`
22-
装箱和拆箱操作,用于转换从原始类型到包装类,自动插入。静态方法 `asList` 可以使用任意数量的参数,将它们放入一个数组中,然后返回一个由数组支持的新列
23-
表。新的循环形式,`foreach` 被用来绑定一个变量依次到列表的每个元素,循环体将这些添加到总和中。该断言语句(在 `Java1.4` 中引入)用于检查总和是否正
24-
确。当启用断言时,如果条件不成立,则会引发错误。
25-
 
18+
19+
不需要太多的解释你就可以读懂代码,但是让我们来看看关键特征。接口列表和类数组是集合框架的一部分(都可以在 `java.util` 包中找到)。类型 `List` 现在是通用的;你写 `List<E>` 以指示具有类型 `E` 的元素的列表。这里我们写 `List<Integer>` 指出列表的元素属于 `Integer` 类,即包装类对应于基本类型`int`。装箱和拆箱操作,用于转换从原始类型到包装类,自动插入。静态方法 `asList` 可以使用任意数量的参数,将它们放入一个数组中,然后返回一个由数组支持的新列表。新的循环形式,`foreach` 被用来绑定一个变量依次到列表的每个元素,循环体将这些添加到总和中。该断言语句(在 `Java1.4` 中引入)用于检查总和是否正确。当启用断言时,如果条件不成立,则会引发错误。
20+
2621
下面是在泛型之前 `Java` 中相同作用的代码:
2722

2823
```java
@@ -37,24 +32,20 @@
3732
assert s == 6;
3833
```
3934

40-
阅读这段代码并不是那么容易。 没有泛型,就没有办法指出类型声明你打算在列表中存储什么样的元素,所以而不是写 `List<Integer>`,你写 `List`。  现在是
41-
编辑器而不是编译器谁负责记住列表元素的类型,所以你必须写下从列表中提取元素时将其转换为(整数)。 没有装箱和拆箱,你必须显式地分配属于包装类
42-
`Integer` 的每个对象并使用 `intValue` 方法提取相应的基元 `int`。 没有功能接受可变数量的参数,您必须显式地分配一个数组传递给`asList`方法。 没有新的
43-
循环形式,你必须显式声明一个迭代器,并通过列表推进。
35+
阅读这段代码并不是那么容易。 没有泛型,就没有办法指出类型声明你打算在列表中存储什么样的元素,所以而不是写 `List<Integer>`,你写 `List`。  现在是编辑器而不是编译器谁负责记住列表元素的类型,所以你必须写下从列表中提取元素时将其转换为(整数)。 没有装箱和拆箱,你必须显式地分配属于包装类 `Integer` 的每个对象并使用 `intValue` 方法提取相应的基元 `int`。 没有功能接受可变数量的参数,您必须显式地分配一个数组传递给`asList`方法。 没有新的循环形式,你必须显式声明一个迭代器,并通过列表推进。
4436

4537
顺便说一句,下面是如何在泛型之前用 `Java` 中的数组做同样的事情:
4638

4739
```java
4840
int[] ints = new int[] { 1,2,3 };
4941
int s = 0;
50-
for (int i = 0; i < ints.length; i++) {
51-
s += ints[i];
42+
for (int i = 0; i < ints.length; i++) {
43+
s += ints[i];
5244
}
5345
assert s == 6;
5446
```
5547

56-
这比使用泛型和集合的相应代码略长,可以说是不太可读,而且肯定不够灵活。 集合让你轻松增大或缩小集合的大小,或在切换到适当的不同的表示形式时,如链表或散
57-
列表或有序树。`java` 的泛型,装箱和拆箱,`foreach` 循环和 `Java` 中的可变参数标志着第一次使用集合与使用数组一样简单,甚至可能更简单。
48+
这比使用泛型和集合的相应代码略长,可以说是不太可读,而且肯定不够灵活。 集合让你轻松增大或缩小集合的大小,或在切换到适当的不同的表示形式时,如链表或散列表或有序树。`java` 的泛型,装箱和拆箱,`foreach` 循环和 `Java` 中的可变参数标志着第一次使用集合与使用数组一样简单,甚至可能更简单。
5849

5950
现在我们来看一下这些功能的更多细节。
6051

ch01/02_Boxing_and_Unboxing.md

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,29 @@
2424
`e.intValue()`。例如,集合
2525

2626
```java
27-
List<Integer> ints = new ArrayList<Integer>();
28-
ints.add(1);
29-
int n = ints.get(0);
27+
List<Integer> ints = new ArrayList<Integer>();
28+
ints.add(1);
29+
int n = ints.get(0);
3030
```
3131

3232
相当于集合:
3333

3434
```java
35-
List<Integer> ints = new ArrayList<Integer>();
36-
ints.add(Integer.valueOf(1));
37-
int n = ints.get(0).intValue();
35+
List<Integer> ints = new ArrayList<Integer>();
36+
ints.add(Integer.valueOf(1));
37+
int n = ints.get(0).intValue();
3838
```
3939

4040
调用 `Integer.valueOf(1)` 与新的 `Integer(1)` 表达式类似,但是可能会缓存一些值以提高性能,正如我们稍后解释的那样。
4141

4242
在这里,再次,是代码来找到一个整数集合的和,方便打包为一个静态的方法:
4343

4444
```java
45-
public static int sum (List<Integer> ints) {
46-
int s = 0;
47-
for (int n : ints) { s += n; }
48-
return s;
49-
}
45+
public static int sum (List<Integer> ints) {
46+
int s = 0;
47+
for (int n : ints) { s += n; }
48+
return s;
49+
}
5050
```
5151

5252
为什么参数的类型是 `List<Integer>` 而不是 `List<int>`? 因为类型参数必须始终绑定到引用类型,而不是基本类型。
@@ -58,11 +58,11 @@
5858
我们可以重写这个方法,用Integer来替换每个 `int` 的出现:
5959

6060
```java
61-
public static Integer sumInteger(List<Integer> ints) {
62-
Integer s = 0;
63-
for (Integer n : ints) { s += n; }
64-
return s;
65-
}
61+
public static Integer sumInteger(List<Integer> ints) {
62+
Integer s = 0;
63+
for (Integer n : ints) { s += n; }
64+
return s;
65+
}
6666
```
6767

6868
此代码编译,但执行了很多不必要的工作。 循环的每个迭代将 `s``n` 中的值拆箱,执行加法操作,然后再次结束结果。使用 `Sun` 当前的编译器,测量结果显示
@@ -72,9 +72,9 @@
7272
来定义。 所以下面的两个断言使用 `Sun``JVM` 是成功的:
7373

7474
```java
75-
List<Integer> bigs = Arrays.asList(100,200,300);
76-
assert sumInteger(bigs) == sum(bigs);
77-
 assert sumInteger(bigs) != sumInteger(bigs); // 不推荐
75+
List<Integer> bigs = Arrays.asList(100,200,300);
76+
assert sumInteger(bigs) == sum(bigs);
77+
  assert sumInteger(bigs) != sumInteger(bigs); // 不推荐
7878
```
7979

8080
在第一个断言中,拆箱会导致值进行比较,所以结果是相同的。在第二个断言中,没有拆箱,两个方法调用返回不同整数对象,所以即使两个整数对象都表示结果也是不
@@ -85,9 +85,9 @@
8585
个字节或一个布尔值; 并在装箱时允许进行缓存。因此,与我们之前的例子相比,我们有以下几点:
8686

8787
```java
88-
List<Integer> smalls = Arrays.asList(1,2,3);
89-
assert sumInteger(smalls) == sum(smalls);
90-
assert sumInteger(smalls) == sumInteger(smalls); // 不推荐
88+
List<Integer> smalls = Arrays.asList(1,2,3);
89+
assert sumInteger(smalls) == sum(smalls);
90+
assert sumInteger(smalls) == sumInteger(smalls); // 不推荐
9191
```
9292

9393
这是因为 `6` 小于 `128`,所以装箱数值 `6` 总是返回正确的同一个对象。 一般来说,没有规定两次是否装箱相同的值返回相同或不同的对象,所以前面显示的不等

ch01/03_Foreach.md

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@
66
在这里,我们的代码也是计算整数列表的总和
77

88
```java
9-
List<Integer> ints = Arrays.asList(1,2,3);
10-
int s = 0;
11-
for (int n : ints) { s += n; }
12-
assert s == 6;
9+
List<Integer> ints = Arrays.asList(1,2,3);
10+
int s = 0;
11+
for (int n : ints) {
12+
s += n;
13+
}
14+
assert s == 6;
1315
```
1416

1517
第三行中的循环被称为 `foreach` 循环,即使它是用关键字。 它相当于以下内容:
1618

1719
```java
18-
for (Iterator<Integer> it = ints. iterator(); it.hasNext(); ) {
19-
int n = it.next();
20-
s += n;
21-
}
20+
for (Iterator<Integer> it = ints. iterator(); it.hasNext(); ) {
21+
int n = it.next();
22+
s += n;
23+
}
2224
```
2325

2426
强调的代码对应于用户编写的内容,编码器以系统的方式添加失码代码。 它引入了 `Iterator<Integer>` 类型的变量来迭代 `List<Integer>` 类型的列表整型。 通
@@ -29,54 +31,54 @@ for (Iterator<Integer> it = ints. iterator(); it.hasNext(); ) {
2931
定义了 `iterator``hasNext``next`,它们被 `foreach` 循环的翻译使用(迭代器也有一个方法 `remove`,它不被翻译使用):
3032

3133
```java
32-
interface Iterable<E> {
33-
public Iterator<E> iterator();
34-
}
35-
interface Iterator<E> {
36-
public boolean hasNext();
37-
public E next();
38-
public void remove();
39-
}
34+
interface Iterable<E> {
35+
public Iterator<E> iterator();
36+
}
37+
interface Iterator<E> {
38+
public boolean hasNext();
39+
public E next();
40+
public void remove();
41+
}
4042
```
4143

4244
集合框架中的所有集合,集合和列表都实现了 `Iterable<E>` 接口; 而其他供应商或用户定义的类也可以实现它。`foreach` 循环也可以应用于一个数组:
4345

4446
```java
45-
public static int sumArray(int[] a) {
46-
int s = 0;
47-
for (int n : a) { s += n; }
48-
return s;
49-
}
47+
public static int sumArray(int[] a) {
48+
int s = 0;
49+
for (int n : a) { s += n; }
50+
return s;
51+
}
5052
```
5153

5254
`foreach` 循环是故意保持简单的,只捕获最常见的情况。如果你想使用 `remove` 方法或者并行迭代多个列表,你需要明确地引入一个迭代器。这是一个从
5355
`Double` 列表中删除负值的方法:
5456

5557
```java
56-
public static void removeNegative(List<Double> v) {
57-
for (Iterator<Double> it = v.iterator(); it.hasNext();) {
58-
if (it.next() < 0) it.remove();
59-
}
60-
}
58+
public static void removeNegative(List<Double> v) {
59+
for (Iterator<Double> it = v.iterator(); it.hasNext();) {
60+
if (it.next() < 0) it.remove();
61+
}
62+
}
6163
```
6264

6365
这里是计算两个向量的点积的方法,表示为 `Double` 列表,两个长度都相同。 给定两个向量:
6466
`u1, … , un``v1, … , vn` 他们计算: u1 * v1> + … + un * vn:
6567

6668
```java
67-
public static double dot(List<Double> u, List<Double> v) {
68-
if (u.size() != v.size())
69-
throw new IllegalArgumentException("different sizes");
70-
double d = 0;
71-
Iterator<Double> uIt = u.iterator();
72-
Iterator<Double> vIt = v.iterator();
73-
while (uIt.hasNext()) {
74-
assert uIt.hasNext() && vIt.hasNext();
75-
d += uIt.next() * vIt.next();
76-
}
77-
assert !uIt.hasNext() && !vIt.hasNext();
78-
return d;
79-
}
69+
public static double dot(List<Double> u, List<Double> v) {
70+
if (u.size() != v.size())
71+
throw new IllegalArgumentException("different sizes");
72+
double d = 0;
73+
Iterator<Double> uIt = u.iterator();
74+
Iterator<Double> vIt = v.iterator();
75+
while (uIt.hasNext()) {
76+
assert uIt.hasNext() && vIt.hasNext();
77+
d += uIt.next() * vIt.next();
78+
}
79+
assert !uIt.hasNext() && !vIt.hasNext();
80+
return d;
81+
}
8082
```
8183

8284
两个迭代器 `uIt``vIt` 在锁定步骤中跨越列表 `u``v`。 循环条件只检查第一个迭代器,但断言确认我们可以有使用第二个迭代器,因为我们先前测试了两

ch02/08_Restrictions_on_Wildcards.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
《《《 [返回首页](../README.md) <br/>
22
《《《 [上一节](07_Wildcard_Capture.md)
33

4+
### 对通配符的限制
5+
46
通配符可能不会出现在类实例创建表达式(新建)的顶层,泛型方法调用中的显式类型参数或超类型(扩展和实现)中。
57

68
**实例创建**在类实例创建表达式中,如果类型是参数化类型,则没有任何类型参数可能是通配符。 例如,以下是非法的:
@@ -10,8 +12,7 @@
1012
Map<String, ? extends Number> map = new HashMap<String, ? extends Number>(); // 编译报错
1113
```
1214

13-
这通常不是困难。 `Get``Put` 原则告诉我们,如果一个结构体包含通配符,那么我们只应该从中得到值(如果它是一个扩展通配符)或者只将值放入它中(如果它
14-
是一个超级通配符)。 为了使结构有用,我们必须同时做到这两点。 因此,我们通常以精确的类型创建结构,即使我们使用通配符类型将值放入或从结构中获取值,如
15+
这通常不是困难。 `Get``Put` 原则告诉我们,如果一个结构体包含通配符,那么我们只应该从中得到值(如果它是一个扩展通配符)或者只将值放入它中(如果它是一个超级通配符)。 为了使结构有用,我们必须同时做到这两点。 因此,我们通常以精确的类型创建结构,即使我们使用通配符类型将值放入或从结构中获取值,如
1516
下例所示:
1617

1718
```java
@@ -36,8 +37,7 @@
3637
即使列表的列表是以通配符类型创建的,其中的每个单独列表都有一个特定的类型:第一个列表是整数列表,第二个列表是字符串列表。 通配符类型禁止我们将内部列表
3738
中的元素作为 `Object` 以外的任何类型提取,但由于这是 `toString` 使用的类型,因此此代码的类型很好。
3839

39-
记住限制的一种方式是通配符和普通类型之间的关系类似于接口和类通配符之间的关系,接口更普遍,普通类型和类更具体,实例创建需要更具体的信息。 考虑以下三条
40-
陈述:
40+
记住限制的一种方式是通配符和普通类型之间的关系类似于接口和类通配符之间的关系,接口更普遍,普通类型和类更具体,实例创建需要更具体的信息。 考虑以下三条陈述:
4141

4242
```java
4343
List<?> list = new ArrayList<Object>(); // ok

ch03/00_Comparison_and_Bounds.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
《《《 [返回首页](../README.md) <br/>
22
《《《 [上一节](../ch02/08_Restrictions_on_Wildcards.md)
33

4-
## 比较和界限
4+
### 比较和界限
55

66
现在我们已经掌握了基本知识,让我们看看泛型的一些更高级的用法。本章介绍用于支持元素比较的接口 `Comparable <T>``Comparator <T>`。 例如,如果要查找
77
集合的最大元素或对列表进行排序,这些接口很有用。 一路上,我们将介绍类型变量的界限,这是泛型的一个重要特性,与 `Comparable <T>` 界面结合使用特别有用。

ch03/07_Bridges.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
《《《 [返回首页](../README.md) <br/>
22
《《《 [上一节](06_Multiple_Bounds.md)
33

4-
## 桥梁
4+
### 桥梁
55

66
正如我们前面提到的,泛型是通过擦除来实现的:当你用泛型编写代码时,它的编译方式几乎与没有泛型编写的代码完全相同。在参数化接口(如 `Comparable<T>`)的
77
情况下,这可能会导致编译器插入其他方法;这些附加的方法被称为网桥。

ch03/08_Covariant_Overriding.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
《《《 [返回首页](../README.md) <br/>
22
《《《 [上一节](07_Bridges.md)
33

4-
## 协变覆盖
4+
### 协变覆盖
55

66
`Java 5` 支持协变方法重写。 这个特性与泛型没有直接关系,但我们在这里提到它,因为它值得了解,并且因为它使用了上一节中描述的桥接技术来实现。
77

ch04/00_Declarations.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
《《《 [返回首页](../README.md) <br/>
22
《《《 [上一节](../ch03/08_Covariant_Overriding.md)
33

4-
# 声明
4+
## 声明
55

66
本章讨论如何声明一个通用类。 它描述了构造函数,静态成员和嵌套类,它填补了擦除工作的一些细节。
77

ch04/01_Constructors.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
《《《 [返回首页](../README.md) <br/>
22
《《《 [上一节](00_Declarations.md)
33

4-
## 构造函数
4+
### 构造函数
55

66
在泛型类中,类型参数出现在声明类的头中,但不在构造函数中:
77

0 commit comments

Comments
 (0)