为什么是List list = new ArrayList(),而不直接用ArrayList?

编程是要面向对象编程,针对抽象(接口),而非具体。List 是接口,ArrayList是实现。

实现List接口的有ArrayList、LinkedList、Vector等,所以用哪个就直接new 一个接口实现

这是一种很好的设计模式.一个接口有多种实现,这种写法是java面向对象的一种思想,依赖倒置原则,即依赖于抽象不依赖于实现(具体)

给调用者提供的应该是接口或者抽象类,而实现者可以实现或者继承接口或者抽象类来满足调用者,这样调用者不必知道实现者怎样操作,实现者也可以根据具体情况去实现,这样去除了耦合。这就是java设计模式的基础思想之一。

从Java语法上,这种方式是使用接口引用指向具体实现,这样大大提高了代码使用的灵活性。

比如,你若希望用LinkedList的实现来替代ArrayList的话,只需改动一行即可:

List   list   =   new   LinkedList(); 

而程序中的其它部分不需要改动,这样比较灵活,不会失去通用性。

不过有的时候,你如果能确定后边用的全部是ArrayList,最好使用ArrayList list = new ArrayList();

ArrayList   list   =   new   ArrayList()

将ArrayList   改为了List,并且返回了这个List

那么以后用的烦恼就是

 if(list   instanceOf   java.util.ArrayList){ 

 //do something

 } 

 else   if(list   instanceOf   java.util.LinkedList){ 

 //error

 } 

 else   if(list   instanceOf   cn.com.bigc.myList){ 

 //do;……some   xp   not   defined   in   List 

 } 

 ……

如果你要想把这个if   else去掉,那么,你还必须再写几个类。呵呵,这样的代价是不值得的。

如果你事先已经确定了你肯定采用ArrayList,为什么要用List代替呢?如果用List代替,那么肯定是我所有的操作基本上都是它父类已经定义好的,否则这种替代,个人以为不一定合算。

为什么是List list = new ArrayList() 而不直接用ArrayList的更多相关文章

  1. Mybatis学习之自定义持久层框架(一) 为什么要用框架而不直接用JDBC?

    前言 说起Mybatis,相信大家都不会感到陌生,它是一款优秀的持久层框架,应用于java后端开发中,为客户端程序提供访问数据库的接口. 我们都知道,JDBC是Java语言中用来规范客户端程序如何来访 ...

  2. 直接用<img> 的src属性显示base64转码后的字符串成图片

    直接用<img> 的src属性显示base64转码后的字符串成图片 <img src="base64转码后的字符串" ></img> 下面的图片 ...

  3. javase基础回顾(一)ArrayList深入解析 解读ArrayList源代码(JDK1.8.0_92)

    我们在学习这一块内容时需要注意的一个问题是 集合中存放的依然是对象的引用而不是对象本身. List接口扩展了Collection并声明存储一系列元素的类集的特性.使用一个基于零的下标,元素可以通过它们 ...

  4. 直接用<img> 的src属性显示base64转码后的字符串成图片【原】

    直接用<img> 的src属性显示base64转码后的字符串成图片 <img src="data:image/gif;base64,base64转码后的字符串" ...

  5. new ArrayList(0) 和 new ArrayList() 和一样吗?

    第一感觉是一样的,盲猜后者调用了前者,并传入参数 0.然而,无论是 JDK 7 还是 JDK 8,这两个方法构造的结果都是不一样的.JDK 开发人员在这方面作了优化. JDK 7 在 Java 7 中 ...

  6. 服务之间的调用为啥不直接用 HTTP 而用 RPC?

    什么是 RPC?RPC原理是什么? 什么是 RPC? RPC(Remote Procedure Call)-远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.比 ...

  7. BigDecimalAvoidDoubleConstructorRule:不要直接用double变量作为构造BigDecimal的参数

    先上结论: 不要直接用double变量作为构造BigDecimal的参数. 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这个数字保存在一 ...

  8. 每日学习笔记:js中可以直接用id名调用的问题?

    在JavaScript中,标准的id选择器调用语法是: document.getElementById('myid').style.width = pc + "%"; 但是,今天发 ...

  9. 只用@property定义一个属性speed,子类不能直接用_speed,需要在interface的成员变量列表里写上_speed

    //写法一: @interface Person : NSObject { } @property (nonatomic, strong) NSString *name; @end @implemen ...

随机推荐

  1. pom.xml

    使用intelJ idea 导入maven包管理文件是,使用Import的方式导入,会自动导入pom.xml来导入包. pom.xml会指定父子关系. 例如,总模块的pom.xml中有一下内容: &l ...

  2. asp.net缓存(转)

    转自:http://www.cnblogs.com/knowledgesea/archive/2012/06/20/2536603.html 一.缓存概念,缓存的好处.类型.            缓 ...

  3. endnote参考文献格式设置

    endnote参考文献格式调整: 在office word 2010中加载了endnote x7插件之后,使用过程中发现格式有点乱,不该斜的地方斜体显示,该加方框[]的地方却没有方框,因此从网路上找资 ...

  4. 最新 DEDECMS SQL 注入 0day

    4月29日消息:国内安全研究团队“知道创宇”称截获到最新DEDECMS SQL注入0day,DEDECMS官网目前提供下载的最新版5.7也受影响,截止本告警发出时官方尚未给出补丁或解决方案,此漏洞利用 ...

  5. HDU 4858 项目管理(邻接表 暴力模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4858 我们建造了一个大项目!这个项目有n个节点,用很多边连接起来,并且这个项目是连通的! 两个节点间可 ...

  6. C语言课程2——我们交流的工具:Coding.net

    各位同学,大家好,在我们本学期既有老师的课堂授课,同样也有我与你们在线的辅导:那么问题来了,我与你们之间是通过何种方式进行交流,比如你的代码我怎么修改,怎样看到修改了哪些地方,我对你们的代码怎样批注, ...

  7. Linux 千万不要执行的10个命令

    1. rm -rf 命令 rm -rf命令是删除文件夹及其内容最快的方式之一.仅仅一丁点的敲错或无知都可能导致不可恢复的系统崩坏.下列是一些rm 命令的选项. rm 命令在Linux下通常用来删除文件 ...

  8. [ruby on rails] 跟我学之(5)显示所有数据

    之前的index页,显示的是hello world,现在将其修改为显示我们在rails console里面录入的数据. 1. 修改action 如之前的章节<[ruby on rails] 跟我 ...

  9. Html form 表单提交前验证

    可以使用form表单的onsubmit方法,在提交表单之前,对表单或者网页中的数据进行检验. onsubmit指定的方法返回true,则提交数据:返回false不提交数据. 直接看下面的代码: 1 & ...

  10. sublime text多文件夹查找关键字

    Ctrl+shift+F 快捷键在文件夹内查找,与普通编辑器不同的地方是sublime允许添加多个文件夹进行查找 转自:http://www.douban.com/note/362268947/