2013-03-19 41 views
5
Collection list = new LinkedList(); // Good? 
LinkedList list = new LinkedList(); // Bad? 

第一变体提供了更多的灵活性,但是是这样吗?是否有其他理由更喜欢它?性能如何?集合是否比LinkedList更好?

+1

集合是由LinkedList实现的接口。你应该总是在实现中指向一个接口。 – emd 2013-03-19 20:54:36

回答

7

这些设计决策,和一个大小通常不适合所有。同样,内部用于成员变量的内容的选择可以(通常应该)与暴露于外部世界的内容不同。

在它的心脏,Java的集合框架没有提供一套完整的描述了性能特性,而不暴露的实现细节的接口。描述性能的一个接口,RandomAccess是一个标记接口,甚至不会扩展Collection或重新公开get(index) API。所以我不认为有一个好的答案。作为一条经验法则,我尽可能不确定类型,直到我认识(并记录)一些重要的特征。例如,只要我希望方法知道插入顺序被保留,我将从Collection更改为List,并记录为什么该限制很重要。同样,如果从前面高效地移除变得重要,则从List移动到LinkedList

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

0

它们完全相同。使用其中一个的唯一原因是,如果您稍后想要使用仅存在于类LinkedList中的列表函数,则需要使用第二个函数。

2
Collection list = new LinkedList(); //bad 

这是不好的,因为,你不希望这个参考指说的HashSet的(如HashSet中还实现了采集等做许多其他类的在收集框架)。

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

这是不好的,因为好的做法是总是编码到接口。

List list = new LinkedList();//good 

这是一件好事,因为点2天,以便(Always Program To an Interface

+1

为什么使用List很好,使用Collection是不好的? – GraphicsToBe 2013-03-19 20:50:01

+0

@GraphicsToBe检查我的编辑:) – PermGenError 2013-03-19 20:53:36

+1

@Aboutblank数组不是集合,也不是集合:) – PermGenError 2013-03-19 20:55:11

1

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

2

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

0

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

在你的例子,我通常会宣布它作为一个List只是因为Collection可用的方法是不是很厉害,和List和另一CollectionMapSet等)之间的区别往往是在逻辑上显著。

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

+0

downvote的任何理由? – ach 2013-03-20 12:39:08

相关问题