3

像这样定义数组列表有什么区别:

List list = new LinkedList(); 

像这样?

LinkedList list = new LinkedList();
4

5 回答 5

2

第一个声明一个 List,并使用 List 接口的新 LinkedList 具体实现对其进行初始化。其余的代码不关心具体的实现。唯一重要的是它是一个列表。如果您稍后意识到 ArrayList 更有效,则只需更改初始化即可。

第二个声明一个 LinkedList,并用一个新的 LinkedList 对其进行初始化。其余代码知道它是一个 LinkedList,并且可以使用 LinkedList 中不在 List 中的方法。如果您稍后意识到 ArrayList 更有效,您可能必须更改其余代码。

通常应该首选第一个:尽可能使用最通用的类​​型,并将代码用于接口而不是实现。

此外,您永远不应使用原始类型,而应始终使用泛型类型:

List<String> list = new LinkedList<String>();
于 2012-06-13T14:44:36.173 回答
2

正如其他答案所建议的那样, List 是接口,而 LinkedList 是实际的实现类型。例如,如果您后来决定要使用 ArrayList,则可以键入:

List list = new ArrayList();

因为 ArrayList 声明了接口 List。缺点是,如果您想稍后调用不属于 List 接口一部分的 ArrayList/LinkedList/(具有不在列表中的方法的其他类名)的任何方法(这可能不会成为问题),您必须检查它是否真的是 ArrayList 等,并将其转换为这些类型。像这样:

ArrayList arrayList = (ArrayList) list;

*只有在检查它确实是一个 ArrayList 之后,否则你会抛出一个异常。

于 2012-06-13T14:45:29.740 回答
1

一种是使用变量类型的接口。另一个使用具体的类类型。

一般来说,对变量类型使用接口类型会更好,因为它们更容易移植,并且产生的耦合更小。

于 2012-06-13T14:39:21.647 回答
1

这称为接口编码。它有一定的好处。根据您的问题,我认为您是这种语言的新手。

根据java world,以下是一些好处

设计:可以快速指定对象的方法并将其发布给所有受影响的开发人员开发:Java 编译器保证接口的所有方法都以正确的签名实现,并且接口的所有更改对其他开发人员立即可见集成:由于其完善的接口,能够将类或子系统快速连接在一起 测试:接口有助于隔离错误,因为它们将可能的逻辑错误的范围限制在给定的方法子集中

这是开始阅读http://www.javaworld.com/jw-08-1999/jw-08-interfaces.html的好地方

于 2012-06-13T14:43:31.457 回答
0

两者都有效。区别在于它List是一个接口,LinkedList是一个实现。使用接口被认为是一种更好的做法,因为您可以在以后轻松切换实现。

于 2012-06-13T14:40:14.587 回答