【问题标题】:List versus ArrayList [duplicate]List 与 ArrayList [重复]
【发布时间】:2018-02-23 00:06:03
【问题描述】:

哪个更好,为什么?

a)List<String> list = new ArrayList<>();

b)ArrayList<String> list = new ArrayList<>();

【问题讨论】:

标签: java inheritance run-time-polymorphism


【解决方案1】:

这取决于上下文。

如果您只关心列表语义而不关心特定实现,请选择List<String>。如果您想强制执行特定的实现,请选择 ArrayList<String>LinkedList<String> 或其他任何内容。

在大多数情况下,您会希望继续使用接口而不是特定的实现。

【讨论】:

    【解决方案2】:

    (a) 更好,因为它更灵活。例如,如果您的需求突然发生变化并说“我们不会创建一个新的空数组列表来分配给变量list,而是使用从另一个列表中过滤的项目填充list”,您需要更改您的代码那。你可以把它改成这样:

    List<String> list = anotherList.stream().filter(x -> x.length() > 2).collect(Collectors.toList());
    

    由于collect(Collectors.toList())返回List,如果你使用(b)中的代码,你还需要更改list的类型。

    另一种情况是,后来你发现你需要分配一些其他类型的列表,例如LinkedListlist。如果您使用 (a) 中的代码,您可以直接分配链表。如果您使用的是 (b) 中的代码,则必须返回 list 的声明并更改类型。

    一般模式是,当您使用更多“抽象”类型时,您的代码会变得更加灵活,但同时您可以对变量做更少的事情。例如,您不能在list 变量上使用仅在ArrayList 中声明的方法,但另一方面,可以将其他类型的列表分配给list。如果你是一个更抽象的类型,Collection,那么你就不能再使用只在List 中声明的成员,但是可以分配各种集合——SetMap 等等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-30
      • 2021-12-19
      • 1970-01-01
      • 2019-08-24
      • 2011-10-15
      • 2011-10-21
      • 2010-09-28
      相关资源
      最近更新 更多