哪个更好,为什么?
一个)List<String> list = new ArrayList<>();
b)ArrayList<String> list = new ArrayList<>();
哪个更好,为什么?
一个)List<String> list = new ArrayList<>();
b)ArrayList<String> list = new ArrayList<>();
这取决于上下文。
如果您只关心列表语义而不关心特定实现,请选择List<String>
. 如果您想强制执行特定的实现,请选择ArrayList<String>
,LinkedList<String>
或其他任何东西。
在大多数情况下,您将希望继续使用接口而不是特定的实现。
(a) 更好,因为它更灵活。例如,如果突然您的需求发生变化并说“我们不会创建一个新的空数组列表来分配给变量list
,而是使用从另一个列表过滤的项目填充list
”,您需要为此更改代码。你可以把它改成这样:
List<String> list = anotherList.stream().filter(x -> x.length() > 2).collect(Collectors.toList());
由于collect(Collectors.toList())
返回 a ,如果您使用 (b) 中的代码List
,您还需要更改类型。list
另一种情况是,后来你发现你需要分配一些其他类型的列表,LinkedList
例如list
. 如果您使用 (a) 中的代码,您可以直接分配链表。如果您使用 (b) 中的代码,则必须返回声明list
并更改类型。
一般模式是,当您使用更多“抽象”类型时,您的代码会变得更加灵活,但同时您可以对变量做更少的事情。例如,您不能使用仅在变量中声明的方法ArrayList
,list
但另一方面,可以将其他类型的列表分配给list
. 如果你是一个更抽象的类型,Collection
那么你不能再使用只声明的成员,但是可以分配List
各种集合 -Set
等等。Map