使用双括号初始化连接列表

时间:2015-06-15 13:06:20

标签: java arraylist double-brace-initialize

我想连接两个数组列表,如the answer中所示:

final List<String> l1 = Lists.newArrayList(...);
final List<String> l2 = Lists.newArrayList(...);
List<String> l = new ArrayList<String>() { { addAll(l1); addAll(l2); } };

有没有非风格的原因我不应该这样使用它?

2 个答案:

答案 0 :(得分:2)

如果您已经在使用Guava,可以使用以下单行代码执行此操作:

List<String> l = FluentIterable.from(l1).append(l2).copyInto(new ArrayList<String>());

我个人不喜欢双括号。这产生新类只是为了以不同的方式初始化它。新类意味着更大的目标jar文件,JVM存储类需要更多内存,JIT编译器需要更大的继承表等。如果你在任何地方使用这种方法,这可能会变得很重要。如果将此ArrayList返回到另一个组件并且不再使用当前组件(例如,您正在使用OSGi或其他模块系统),则可能最终挂起ClassLoader,该链接仅由这个匿名课程。此外,如果您关心序列化,则应在此新类中声明serialVersionID。即使您不在乎,也可能会对此发出警告。

答案 1 :(得分:1)

嗯,首先,它取决于您希望如何处理重复元素。此代码将保留任何重复项(即l1l2都包含"someString"l将包含两个"someString"),因此它不是真正的联合操作。将其称为两个列表的串联将更准确。

除此之外,使用“双括号”实际上是创建一个扩展ArrayList的匿名类的实例。我认为这是一种糟糕的代码风格。

List<String> l = new ArrayList<String>(l1);
l.addAll(l2);

更清晰,不再写。