Collection是否比LinkedList更好?

时间:2013-03-19 20:47:09

标签: java collections

Collection list = new LinkedList(); // Good?
LinkedList list = new LinkedList(); // Bad?

第一种变体提供了更大的灵活性,但这就是全部吗?还有其他理由喜欢它吗?性能怎么样?

6 个答案:

答案 0 :(得分:7)

这些是设计决策,一种尺寸通常不适合所有。内部使用的成员变量的选择也可以(并且通常应该)与暴露给外部世界的内容不同。

从本质上讲,Java的集合框架不提供描述性能特性的完整接口集,而不会暴露实现细节。描述性能的一个界面RandomAccess是标记界面,甚至不会扩展Collection或重新公开get(index) API。所以我认为没有一个好的答案。

根据经验,我认为类型尽可能不具体,直到我认识到(并记录)一些重要的特征。例如,只要我希望方法知道保留了插入顺序,我就会从Collection更改为List,并记录该限制的重要性。同样,如果说从前面有效删除变得很重要,请从List移至LinkedList

当涉及在公共API中公开集合时,我总是试图开始暴露几个预期会被使用的API;例如add(...)iterator()

答案 1 :(得分:2)

Collection list = new LinkedList(); //bad

这很糟糕,因为你不希望这个引用引用一个HashSet(因为HashSet也实现了Collection,因此集合框架中的许多其他类也是如此)。

LinkedList list = new LinkedList(); //bad?

这很糟糕,因为好的做法是始终对接口进行编码。

List list = new LinkedList();//good

这很好,因为点了2天。(Always Program To an Interface

答案 2 :(得分:2)

在非公共对象上使用最具体的类型信息。它们是实现细节,我们希望我们的实现细节尽可能具体和精确。

答案 3 :(得分:1)

不确定。例如,如果java将为List集合找到并实现更有效的实现,但是您已经拥有仅接受LinkedList的API,那么如果您已经拥有此API的客户端,则无法替换该实现。如果使用接口,则可以在不破坏API的情况下轻松替换实现。

答案 4 :(得分:0)

他们完全相同。使用one over another的唯一原因是,如果您以后想要使用仅存在于LinkedList类中的list函数,则需要使用第二个函数。

答案 5 :(得分:0)

我的一般规则是,只有你当时需要的那样具体(或者需要在不久的将来,在合理的范围内)。当然,这有点主观。

在您的示例中,我通常会将其声明为List,因为Collection上的可用方法不是很强大,而List与另一个{{1}之间的区别(CollectionMap等)通常具有逻辑意义。

此外,在Java 1.5+中不要使用原始类型 - 如果您不知道列表将包含的类型,请至少使用Set