Skip to content

Commit fd2a10a

Browse files
authored
Update 08_Array_Creation_and_Varargs.md
1 parent af278d4 commit fd2a10a

File tree

1 file changed

+81
-59
lines changed

1 file changed

+81
-59
lines changed

Diff for: ch06/08_Array_Creation_and_Varargs.md

+81-59
Original file line numberDiff line numberDiff line change
@@ -9,93 +9,115 @@
99
`6-2`。 如何定义 `ArrayList`
1010

1111
```java
12-
import java.util.*;
13-
class ArrayList<E> extends AbstractList<E> implements RandomAccess {
14-
private E[] arr;
15-
private int size = 0;
16-
public ArrayList(int cap) {
17-
if (cap < 0)
18-
throw new IllegalArgumentException("Illegal Capacity: "+cap);
19-
arr = (E[])new Object[cap]; // unchecked cast
20-
}
21-
public ArrayList() { this(10); }
22-
public ArrayList(Collection<? extends E> c) { this(c.size()); addAll(c); }
23-
public void ensureCapacity(int mincap) {
24-
int oldcap = arr.length;
25-
if (mincap > oldcap) {
26-
int newcap = Math.max(mincap, (oldcap*3)/2+1);
27-
E[] oldarr = arr;
28-
arr = (E[])new Object[newcap]; // unchecked cast
29-
System.arraycopy(oldarr,0,arr,0,size);
30-
}
31-
}
32-
public int size() { return size; }
33-
private void checkBounds(int i, int size) {
34-
if (i < 0 || i >= size)
35-
throw new IndexOutOfBoundsException("Index: "+i+", Size: "+size);
36-
}
37-
public E get(int i) { checkBounds(i,size); return arr[i]; }
38-
public E set(int i, E elt) {
39-
checkBounds(i,size); E old = arr[i]; arr[i] = elt; return old;
40-
}
41-
public void add(int i, E elt) {
42-
checkBounds(i,size+1); ensureCapacity(size+1);
43-
System.arraycopy(arr,i,arr,i+1,size-i); arr[i] = elt; size++;
44-
}
45-
public E remove(int i) {
46-
checkBounds(i,size); E old = arr[i]; arr[i] = null; size--;
47-
System.arraycopy(arr,i+1,arr,i,size-i); return old;
48-
}
49-
public <T> T[] toArray(T[] a) {
50-
if (a.length < size)
51-
a = (T[])java.lang.reflect.Array. // unchecked cast
52-
newInstance(a.getClass().getComponentType(), size);
53-
System.arraycopy(arr,0,a,0,size);
54-
if (size < a.length) a[size] = null;
55-
return a;
56-
}
57-
public Object[] toArray() { return toArray(new Object[0]); }
12+
import java.util.*;
13+
class ArrayList<E> extends AbstractList<E> implements RandomAccess {
14+
private E[] arr;
15+
private int size = 0;
16+
public ArrayList(int cap) {
17+
if (cap < 0)
18+
throw new IllegalArgumentException("Illegal Capacity: "+cap);
19+
arr = (E[])new Object[cap]; // unchecked cast
20+
}
21+
public ArrayList() {
22+
this(10);
23+
}
24+
public ArrayList(Collection<? extends E> c) {
25+
this(c.size());
26+
addAll(c);
27+
}
28+
public void ensureCapacity(int mincap) {
29+
int oldcap = arr.length;
30+
if (mincap > oldcap) {
31+
int newcap = Math.max(mincap, (oldcap*3)/2+1);
32+
E[] oldarr = arr;
33+
arr = (E[])new Object[newcap]; // unchecked cast
34+
System.arraycopy(oldarr,0,arr,0,size);
5835
}
36+
}
37+
public int size() {
38+
return size;
39+
}
40+
private void checkBounds(int i, int size) {
41+
if (i < 0 || i >= size)
42+
throw new IndexOutOfBoundsException("Index: "+i+", Size: "+size);
43+
}
44+
public E get(int i) {
45+
checkBounds(i,size);
46+
return arr[i];
47+
}
48+
public E set(int i, E elt) {
49+
checkBounds(i,size);
50+
E old = arr[i];
51+
arr[i] = elt;
52+
return old;
53+
}
54+
public void add(int i, E elt) {
55+
checkBounds(i,size+1);
56+
ensureCapacity(size+1);
57+
System.arraycopy(arr,i,arr,i+1,size-i);
58+
arr[i] = elt;
59+
size++;
60+
}
61+
public E remove(int i) {
62+
checkBounds(i,size);
63+
E old = arr[i];
64+
arr[i] = null;
65+
size--;
66+
System.arraycopy(arr,i+1,arr,i,size-i); return old;
67+
}
68+
public <T> T[] toArray(T[] a) {
69+
if (a.length < size)
70+
a = (T[])java.lang.reflect.Array. // unchecked cast
71+
newInstance(a.getClass().getComponentType(), size);
72+
System.arraycopy(arr,0,a,0,size);
73+
if (size < a.length)
74+
a[size] = null;
75+
return a;
76+
}
77+
public Object[] toArray() {
78+
return toArray(new Object[0]);
79+
}
80+
}
5981
```
6082

6183
`1.4` 节我们讨论了声明为的方法 `java.util.Arrays.asList` 如下:
6284

6385
```java
64-
public static <E> List<E> asList(E... arr)
86+
public static <E> List<E> asList(E... arr)
6587
```
6688

6789
例如,这里有三个对这个方法的调用:
6890

6991
```java
70-
List<Integer> a = Arrays.asList(1, 2, 3);
71-
List<Integer> b = Arrays.asList(4, 5, 6);
72-
List<List<Integer>> x = Arrays.asList(a, b); // 通用数组创建
92+
List<Integer> a = Arrays.asList(1, 2, 3);
93+
List<Integer> b = Arrays.asList(4, 5, 6);
94+
List<List<Integer>> x = Arrays.asList(a, b); // 通用数组创建
7395
```
7496

7597
回想一下,可变长度的参数列表是通过将参数打包到数组中并传递它来实现的。 因此这三个呼叫相当于以下内容:
7698

7799
```java
78-
List<Integer> a = Arrays.asList(new Integer[] { 1, 2, 3 });
79-
List<Integer> b = Arrays.asList(new Integer[] { 4, 5, 6 });
80-
List<List<Integer>> x = Arrays.asList(new List<Integer>[] { a, b }); // 通用数组创建
100+
List<Integer> a = Arrays.asList(new Integer[] { 1, 2, 3 });
101+
List<Integer> b = Arrays.asList(new Integer[] { 4, 5, 6 });
102+
List<List<Integer>> x = Arrays.asList(new List<Integer>[] { a, b }); // 通用数组创建
81103
```
82104

83105
前两个调用很好,但由于 `List<Integer>` 不是可重用的类型,所以第三次在编译时警告未经检查的泛型数组的创建。
84106

85107
```java
86-
VarargError.java:6: warning: [unchecked] unchecked generic array creation
87-
of type java.util.List<java.lang.Integer>[] for varargs parameter
88-
List<List<Integer>> x = Arrays.asList(a, b);
108+
VarargError.java:6: warning: [unchecked] unchecked generic array creation
109+
of type java.util.List<java.lang.Integer>[] for varargs parameter
110+
List<List<Integer>> x = Arrays.asList(a, b);
89111
```
90112

91113
此警告可能会造成混淆,特别是因为该源代码行不包含数组创建的显式实例!
92114

93115
如果您尝试创建泛型类型的列表,则会出现类似的问题。 这是一个使用 `Arrays.asList` 创建包含给定元素的长度列表的方法:
94116

95117
```java
96-
public static List<E> singleton(E elt) {
97-
return Arrays.asList(elt); // 通用数组创建
98-
}
118+
public static List<E> singleton(E elt) {
119+
return Arrays.asList(elt); // 通用数组创建
120+
}
99121
```
100122

101123
这也会产生警告,出于同样的原因可能会造成混淆。

0 commit comments

Comments
 (0)