|
1 |
| -如何用一句代码初始化一个ArrayList |
2 |
| -##问题描述 |
| 1 | +如何用一行代码初始化一个ArrayList |
3 | 2 |
|
4 |
| -我想创建一个用于测试的的选项列表,首先: |
5 |
| -``` |
| 3 | +###问题 |
| 4 | +为了测试,我需要临时快速创建一个list。一开始我这样做: |
| 5 | +```java |
6 | 6 | ArrayList<String> places = new ArrayList<String>();
|
7 | 7 | places.add("Buenos Aires");
|
8 | 8 | places.add("Córdoba");
|
9 | 9 | places.add("La Plata");
|
10 | 10 | ```
|
11 |
| -之后我如下重构了代码: |
12 |
| -``` |
| 11 | +之后我重构了下 |
| 12 | +```java |
13 | 13 | ArrayList<String> places = new ArrayList<String>(
|
14 | 14 | Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
|
15 | 15 | ```
|
16 |
| -是否还有更好的方法来完成这个功能呢? |
| 16 | +是否有更加简便的方法呢? |
17 | 17 |
|
18 |
| -###回答一(750赞) |
19 |
| -实际上,可能初始化ArrayList的“最好”的方法就如你所写的一样,无论如何,都不需要创建一个新的list。 |
| 18 | +###回答 |
| 19 | + |
| 20 | +####常见方式 |
| 21 | +实际上,也许“最好”的方式,就是你写的这个方式,因为它不用再创建新的`List`: |
20 | 22 | ```
|
21 | 23 | ArrayList<String> list = new ArrayList<String>();
|
22 | 24 | list.add("A");
|
23 | 25 | list.add("B");
|
24 | 26 | list.add("C");
|
25 | 27 | ```
|
26 |
| -但问题是,有相当多多的类型需要参考`list`实例。 |
27 |
| -可以有替代的办法,比如使用匿名内部类,初始化实例,也被称为一个“double brace initailzation"。 |
| 28 | +只是这个方式看上去要多写些代码,让人郁闷 |
| 29 | + |
| 30 | +####匿名内部类 |
| 31 | +当然,还有其他方式,例如,写一个匿名内部类,然后在其中做初始化(也被称为 brace initialization): |
28 | 32 | ```
|
29 | 33 | ArrayList<String> list = new ArrayList<String>() {{
|
30 | 34 | add("A");
|
31 | 35 | add("B");
|
32 | 36 | add("C");
|
33 | 37 | }};
|
34 | 38 | ```
|
35 |
| -然而,我不是太喜欢这种方法,因为这样得到是一个初始化一个实例的ArrayList的子类,并且这个类只是被用来创建一个对象,好像我有点过分了。 |
36 |
| -如果 `the Collection Literals proposal for Project Coin (抱歉,不知怎么翻译)`被接受的话,可能是最好的方式(将被引入Java7,但它不太可能成为Java 8的一部分)。 |
37 |
| -[更多关于the Collection Literals proposal的内容链接](http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization) |
38 |
| -``` |
39 |
| -List<String> list = ["A","B","C"]; |
40 |
| -``` |
41 |
| -不行的是,并没有帮到你。这会初始化成一个不可变的列表,而不是一个ArrayList,而且,现在还不能用。 |
| 39 | +但是,我不喜欢这个方式。只是为了做个初始化,却要在`ArrayList`的同一行后面加这么一坨代码。 |
42 | 40 |
|
43 |
| -###回答二(714赞) |
44 |
| -如果你只是作为一个List声明的话,这样可能会更简单.(必须是ArrayList吗) |
| 41 | +####Arrays.asList |
45 | 42 | ```
|
46 | 43 | List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
|
47 | 44 | ```
|
48 |
| -或者只有一个元素: |
| 45 | +####Collections.singletonList |
49 | 46 | ```
|
50 | 47 | List<String> places = Collections.singletonList("Buenos Aires");
|
51 | 48 | ```
|
52 |
| -这意味着places是不可变的(如果改变它,将会抛出一个异常). |
53 |
| -让一个可变列表是一个具体的ArrayList,您可以从不可变列表创建一个ArrayList: |
| 49 | +注意:后面的这两种方式,得到的是一个定长的`List`(如果add操作会抛异常)。如果你需要一个不定长的`List`,可以这样做: |
54 | 50 | ```
|
55 | 51 | ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
|
| 52 | +
|
56 | 53 | ```
|
57 |
| -[原文链接:Initialization of an ArrayList in one line](http://stackoverflow.com/questions/1005073/initialization-of-an-arraylist-in-one-line) |
| 54 | + |
| 55 | +stackoverflow链接: |
| 56 | +http://stackoverflow.com/questions/1005073/initialization-of-an-arraylist-in-one-line |
58 | 57 |
|
0 commit comments