Java中List和ArrayList之间的区别

刚开始学习Java编程语言的人经常怀疑如何在List变量中存储ArrayList对象,List和ArrayList之间有什么区别。
他们的主要区别是List是一个接口,而ArrayList是一个类,而且实现于List。这也意味着ArrayList是List的实现类,在Java或者任何面向对象的语言找中,超类的变量都可以存储子类类型对象,这也称为多态,因为任何虚方法都只从子类执行,即使他们从超类调用的。

为什么将ArrayList存储在List变量上?

List<Movie> listOfMovies = new ArrayList<Movie>();

这里我们使用List作为一种变量来存储ArrayList类的对象,使用new()运算符创建。这称为接口编程。
实际上,在需要声明引用变量的任何地方,都应该使用超类型,例如Map用于传递HashMap,Set用于传递HashSet和List用于传递ArrayList,LinkedList或Vector。您应该在返回类型的方法,参数类型等上使用interface作为类型,如下所示?现在有一个大问题,你为什么要那样做?
答案是利用多态性。如果您使用接口而不是将来如果新的实现已发布,那么您不需要更改您的程序。例如,无论您传递LinkedList,Vector还是ArrayList,使用List编写的任何程序都将按预期工作,因为它们都实现了List接口,它们遵守List接口公开的契约。 唯一的区别在于性能,实际上是改变的驱动因素。简而言之,如果您使用接口进行编程,明天如果您的接口有更好的实现可用,那么您可以切换到该接口,而无需在客户端进行进一步更改(使用该接口的程序的一部分)。

同样,你应该在方法参数上使用接口类型:

public void sort(List <?extends Comparable>input){
//对列表进行排序的逻辑
}

并在返回类型的方法上使用接口类型

public  List <Employee> getEmployees(int departmentId){
        //返回给定部门员工的逻辑 
}

如果将ArrayList的对象存储到ArrayList的引用类型中,如下所示,那么如果传递LinkedList,则代码将不起作用,因为ArrayList不是LinkedList。

public List <Movies> getMovies(LinkedList <String> actors){
 //如果传递ArrayList,此代码将不起作用 
 }

但是下面的代码可以工作,即使你传递ArrayList,Vector,CopyOnWriteArrayList或LinkedList,因为它需要一个List,它是一个接口:

public List <Movies> getMovies(List <String> actors){ 
//如果传递ArrayList,Vector等,此代码将起作用 
}

你的程序几乎是硬编码的,它缺乏多态性和继承所提供的灵活性。这个答案也适用于Map和HashMap或Set和HashSet之间的差异等问题,因为最终它们是相同的问题,界面与它们的实现之间的区别。您必须遵循SOLID原则,在面向对象的编程语言(如Java或C ++)中编写更好的程序。

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值