Java 列表与数组列表
哪一个更好,为什么 a)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)更好,因为它更灵活。例如,如果您的需求突然发生变化,并说“不是创建一个新的空数组列表来分配给变量列表,而是用从另一个列表筛选的项目填充列
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。更好地定义