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