何时在Java中使用各种通用容器

时间:2009-11-20 12:59:08

标签: java collections

有谁知道我可以阅读的任何资源或书籍,以帮助我理解各种Java集合类?
例如:
何时使用Collection<T>代替List<T> 什么时候使用Map<T, V>而不是List<V>,其中V有一个成员getId,如下所示,允许您在列表中搜索与给定键匹配的元素:

class V {
   T getId();
}


谢谢

9 个答案:

答案 0 :(得分:4)

如果您想要类似地图的行为,请使用Map。如果您想要类似列表的行为,请使用List。如果您不在乎,请使用Collection

泛型与此无关。

请参阅Collections tutorial

答案 1 :(得分:3)

你可以看一下sun教程。它详细解释了所有内容。

http://java.sun.com/docs/books/tutorial/collections/index.html(实施部分解释了它们之间的区别)

答案 2 :(得分:2)

This book非常好,涵盖了集合框架和泛型。

答案 3 :(得分:1)

您可以查看java collection API

的文档

无论如何,基本规则是:尽可能通用的参数类型。对于接口的返回类型,尽可能通用。尽可能具体针对最终班级的返回类型。

答案 4 :(得分:0)

一个好的起点是Java API。每个集合都有与之相关的良好描述。之后,您可以在Google上搜索有关Java Collections的各种文章和书籍。

答案 5 :(得分:0)

决定取决于您的数据以及您使用数据的需求。

如果您拥有可以使用特定密钥识别每个元素并希望使用此密钥访问或查找的数据,则应使用地图。

如果您没有钥匙但是您对元素的顺序感兴趣,则可以使用列表。就像你想要按照用户输入的顺序存储的一串字符串。

如果您不想两次存储相同的元素,请选择Set。

如果您在多线程环境中工作,那么您的决定也很有意思。因此,如果许多线程以相同的驯服方式访问同一个列表,您宁愿使用Vector而不是ArrayList。

顺便说一下。对于某些集合,如果您的数据类实现类似的接口或至少覆盖equals函数,则它很有用。

here您会找到更多信息。

答案 6 :(得分:0)

大多数Java书籍都会有很好的扩展集合框架。我发现Object-Oriented-Software-Development-Using有一个很好的章节,可以说明为什么选择一个Collection而不是另一个Collection的原因。

Head first Java也具有良好的intropduction,但可能无法解决选择的问题。

答案 7 :(得分:0)

您的问题的答案是您将如何使用数据结构?为了更好地了解可能性,最好查看整个集合接口层次结构。为简单起见,我将此讨论仅限于经典接口,而忽略了所有并发接口。

Collection
+- List
+- Set
   +- SortedSet

Map
+- SortedMap

因此,我们可以从上面看到,Map和Collection是不同的东西。

一个集合有点类似于一个包,它包含许多值,但对它们没有进一步的保证。列表只是一组有序的值,其中顺序是在外部定义的,而不是从值本身隐式定义的。另一方面,Set是一组值,其中没有两个是相同的,但它们不是明确的,也不是隐式的。 SortedSet是一组隐式排序的唯一值,也就是说,如果迭代这些值,它们将始终以相同的顺序返回。

Map正在从一组键映射到值。 SortedMap是从SortedSet键到值的映射。

至于为什么要使用Map而不是List?这在很大程度上取决于您需要如何查找数据。如果你需要使用密钥进行(有效)随机查找,那么你应该使用一个集合,因为它的实现会给你O(1)或O(lgn)查找。在列表中搜索是O(n)。但是,如果您正在执行某种“批处理”过程,即您正在处理列表中的每个项目,然后是列表,或者如果您需要唯一性约束则设置为更合适。

答案 8 :(得分:0)

其他答案已经涵盖了集合的概述,因此我将添加一条经验法则,适用于您在编程中如何使用集合:

  

严格要求你发送的东西,但要慷慨接受

这有点争议(一些工程师认为你应该总是尽可能严格)但是经验法则是,当应用于集合时,教会我们选择限制用户的集合在参与时最少但在返回结果时会尽可能多地提供信息。

换句话说,方法签名如:

LinkedList< A > doSomething(Collection< A > col);

可能更喜欢:

Collection< A > doSomething(LinkedList< A > list);

在版本1中,您的用户无需按摩他们的数据即可使用您的方法。他们可以传递一个ArrayList&lt; A&gt;,LinkedHashSet&lt; A&gt;或收藏品&lt; A&gt;你会处理的。在从方法接收数据时,他们可以获得更多关于它们可以用它做什么的信息(例如列出特定的迭代器),而不是它们在选项2中的信息。