Skip to content

Commit 05aceb8

Browse files
committed
优化“如何用一行代码初始化一个ArrayList”
1 parent 3e59fa6 commit 05aceb8

File tree

2 files changed

+24
-25
lines changed

2 files changed

+24
-25
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ stackoverflow-Java-top-qa
4040
4141
* [去掉烦人的“!=null"(判空语句](https://github.com/giantray/stackoverflow-java-top-qa/blob/master/contents/avoiding-null-statements-in-java.md)
4242
* [获取完整的堆栈信息](https://github.com/giantray/stackoverflow-java-top-qa/blob/master/contents/get-current-stack-trace-in-java.md)
43-
* [如何通过一行代码初始化ArrayList](https://github.com/giantray/stackoverflow-java-top-qa/blob/master/contents/initialization-of-an-arraylist-in-one-line.md)
43+
* [如何用一行代码初始化一个ArrayList](https://github.com/giantray/stackoverflow-java-top-qa/blob/master/contents/initialization-of-an-arraylist-in-one-line.md)
4444

4545
> 网络
4646
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,57 @@
1-
如何用一句代码初始化一个ArrayList
2-
##问题描述
1+
如何用一行代码初始化一个ArrayList
32

4-
我想创建一个用于测试的的选项列表,首先:
5-
```
3+
###问题
4+
为了测试,我需要临时快速创建一个list。一开始我这样做:
5+
```java
66
ArrayList<String> places = new ArrayList<String>();
77
places.add("Buenos Aires");
88
places.add("Córdoba");
99
places.add("La Plata");
1010
```
11-
之后我如下重构了代码:
12-
```
11+
之后我重构了下
12+
```java
1313
ArrayList<String> places = new ArrayList<String>(
1414
Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
1515
```
16-
是否还有更好的方法来完成这个功能呢
16+
是否有更加简便的方法呢
1717

18-
###回答一(750赞)
19-
实际上,可能初始化ArrayList的“最好”的方法就如你所写的一样,无论如何,都不需要创建一个新的list。
18+
###回答
19+
20+
####常见方式
21+
实际上,也许“最好”的方式,就是你写的这个方式,因为它不用再创建新的`List`:
2022
```
2123
ArrayList<String> list = new ArrayList<String>();
2224
list.add("A");
2325
list.add("B");
2426
list.add("C");
2527
```
26-
但问题是,有相当多多的类型需要参考`list`实例。
27-
可以有替代的办法,比如使用匿名内部类,初始化实例,也被称为一个“double brace initailzation"。
28+
只是这个方式看上去要多写些代码,让人郁闷
29+
30+
####匿名内部类
31+
当然,还有其他方式,例如,写一个匿名内部类,然后在其中做初始化(也被称为 brace initialization):
2832
```
2933
ArrayList<String> list = new ArrayList<String>() {{
3034
add("A");
3135
add("B");
3236
add("C");
3337
}};
3438
```
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`的同一行后面加这么一坨代码。
4240

43-
###回答二(714赞)
44-
如果你只是作为一个List声明的话,这样可能会更简单.(必须是ArrayList吗)
41+
####Arrays.asList
4542
```
4643
List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
4744
```
48-
或者只有一个元素:
45+
####Collections.singletonList
4946
```
5047
List<String> places = Collections.singletonList("Buenos Aires");
5148
```
52-
这意味着places是不可变的(如果改变它,将会抛出一个异常).
53-
让一个可变列表是一个具体的ArrayList,您可以从不可变列表创建一个ArrayList:
49+
注意:后面的这两种方式,得到的是一个定长的`List`(如果add操作会抛异常)。如果你需要一个不定长的`List`,可以这样做:
5450
```
5551
ArrayList<String> places = new ArrayList<>(Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));
52+
5653
```
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
5857

0 commit comments

Comments
 (0)