0

我想连接两个数组列表,如答案所示:

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

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

4

2 回答 2

2

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

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

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

于 2015-06-15T13:15:46.243 回答
1

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

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

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

更清晰,不再写。

于 2015-06-15T13:09:02.193 回答