定义这样的arraylist之间的区别是什么:
List list = new LinkedList();
并且喜欢这个?
LinkedList list = new LinkedList();
答案 0 :(得分:2)
第一个声明一个List,并使用List接口的新LinkedList具体实现对其进行初始化。其余代码不关心具体实现。唯一重要的是它是一个List。如果您稍后意识到ArrayList更有效,则只需更改初始化。
第二个声明一个LinkedList,并用一个新的LinkedList初始化它。其余代码知道它是LinkedList,并且可以使用LinkedList中不在List中的方法。如果您稍后意识到ArrayList更有效,则可能必须更改其余代码。
首先应该首选:尽可能使用最通用的类型,然后编写接口而不是实现。
此外,您永远不应使用原始类型,但始终使用泛型类型:
List<String> list = new LinkedList<String>();
答案 1 :(得分:2)
正如其他答案所示,List是接口,LinkedList是实际的实现类型。例如,如果您后来决定要使用ArrayList,则可以键入:
List list = new ArrayList();
因为ArrayList声明了接口List。缺点是如果你想稍后调用ArrayList / LinkedList /(其他具有不在列表中的方法的类名)的方法,那么这些方法不属于List接口(这可能不是问题),你必须检查它是否真的是一个ArrayList等,并将其转换为这些类型。像这样:
ArrayList arrayList = (ArrayList) list;
*仅在检查它确实是一个ArrayList之后,否则抛出异常。
答案 2 :(得分:1)
一个人使用interface作为变量的类型。另一个使用concrete class类型。
一般来说,最好为变量类型使用接口类型,因为它们更易于移植并且产生的紧密度较低coupling。
答案 3 :(得分:1)
这称为接口编码。它有一定的好处。根据你的问题,我认为你是这种语言的新手。
根据java世界,以下是一些好处
设计:可以快速指定对象的方法 发布给所有受影响的开发人员开发:Java编译器 保证接口的所有方法都是用。实现的 正确的签名以及对接口的所有更改都是 其他开发人员立即可见集成:有 能够快速连接类或子系统,因为 他们完善的接口测试:接口有助于隔离 错误,因为它们将可能的逻辑错误的范围限制在给定的范围内 方法的子集
这是开始阅读http://www.javaworld.com/jw-08-1999/jw-08-interfaces.html
的好地方答案 4 :(得分:0)
两者都有效。区别在于List
是一个接口,LinkedList
是一个实现。使用接口被认为是一种更好的做法,因为您可以在以后轻松切换实现。