Java 列表与数组列表

Java 列表与数组列表,java,inheritance,run-time-polymorphism,Java,Inheritance,Run Time Polymorphism,哪一个更好,为什么 a) List List=new ArrayList() b) ArrayList list=new ArrayList()它取决于上下文 如果您只关心列表语义而不关心特定的实现,请选择list。如果要强制执行特定的实现,请选择ArrayList、LinkedList或其他任何内容 在大多数情况下,您希望继续使用接口,而不是特定的实现。(a)更好,因为它更灵活。例如,如果您的需求突然发生变化,并说“不是创建一个新的空数组列表来分配给变量列表,而是用从另一个列表筛选的项目填充列

哪一个更好,为什么

a)
List List=new ArrayList()


b)
ArrayList list=new ArrayList()

它取决于上下文

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

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

(a)更好,因为它更灵活。例如,如果您的需求突然发生变化,并说“不是创建一个新的空数组列表来分配给变量
列表
,而是用从另一个列表筛选的项目填充
列表
”,您需要为此更改代码。您可以将其更改为以下内容:

List<String> list = anotherList.stream().filter(x -> x.length() > 2).collect(Collectors.toList());
List List=anotherList.stream().filter(x->x.length()>2.collect(Collectors.toList());
由于
collect(Collectors.toList())
返回一个
列表
,因此如果使用(b)中的代码,还需要更改
列表的类型

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

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

a)List List List=new ArrayList();这是最好的。将来,如果您想将ArrayList更改为LinkedList,只需要最少的代码更改。选项a)初始化列表的更好方法,还可以使用集合myStringCollection=new ArrayList();这将允许您的方法不仅仅接受作为ArrayList实例的对象。然后你也可以通过Set。更好地定义