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