Lists,ArrayLists,Maps,Hashmaps,Collections等有什么区别..?

我一直在使用HashMaps,因为我在Java中再次开始编程而没有真正理解这些Collections的东西。

老实说,我不确定是否一直使用HashMaps最适合我或生产代码。 到目前为止,只要我能够以我在PHP中调用它的方式获取我需要的数据对我来说无关紧要(是的,我承认你现在正在考虑的任何负面的事情)其中$this_is_array['this_is_a_string_index']为回忆变量数组提供了很多便利。

所以现在,我已经使用java超过3个月了,并且遇到了我在上面指定的接口并且想知道,为什么有这么多东西(更不用说,矢量,abstractList {哦,这个列表继续… })?

我的意思是他们彼此之间有什么不同?

更重要的是,在我的案例中使用的最佳界面是什么?

API很清楚它们之间的差异和/或关系:


采集

集合层次结构中的根接口。 集合表示一组对象,称为其元素。 有些集合允许重复元素而其他集合则不允许。 有些是订购的,有些是无序的。

http://download.oracle.com/javase/6/docs/api/java/util/Collection.html

名单

有序集合(也称为序列)。 该接口的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。

http://download.oracle.com/javase/6/docs/api/java/util/List.html

不包含重复元素的集合。 更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。 正如其名称所暗示的,此接口模拟数学集抽象。

http://download.oracle.com/javase/6/docs/api/java/util/Set.html

地图

将键映射到值的对象。 地图不能包含重复的键; 每个键最多可以映射一个值。

http://download.oracle.com/javase/6/docs/api/java/util/Map.html


特别是你有什么特别的困惑吗? 如果是,请编辑原始问题。 谢谢。

常见Java集合的简短摘要:

‘Map’:’Map’是一个允许存储key => value对的容器。 这使得使用密钥快速搜索以获得其关联值。 java.util包中有两个实现,’HashMap’和’TreeMap’。 前者实现为hastable ,而后者实现为平衡二叉搜索树 (因此也具有对键进行排序的属性)。

‘Set’:’Set’是一个只包含唯一元素的容器。 多次插入相同的值仍将导致“Set”仅保存一个实例。 它还提供快速操作来搜索,删除,添加,合并和计算两组的交集。 像’Map’一样,它有两个实现,’HashSet’和’TreeSet’。

‘List’:’List’接口由’Vector’,’ArrayList’和’LinkedList’类实现。 “列表”基本上是保留其相对顺序的元素集合。 您可以向其添加/删除元素,并访问任何给定位置的各个元素。 与’Map’不同,’List’项目由int索引,其位置是’List’(第一个元素位于第0位,最后一个元素位于’List.size()’ – 1)。 ‘Vector’和’ArrayList’是使用数组实现的,而’LinkedList’,顾名思义,使用链表 。 需要注意的一点是,与php的关联数组(更像是Map )不同,Java中的数组和许多其他语言实际上代表了一个连续的内存块。 arrays中的元件基本上并排布置在相邻的“槽”上。 这提供了非常快的查找和写入时间,比使用更复杂的数据结构实现的关联数组快得多。 但是,与关联数组不同,它们不能被数组中的数字位置以外的任何其他索引编入索引。

为了更好地了解每个集合的优点及其性能特征,我建议您对数据结构(如数组,链表,二叉搜索树,哈希表以及堆栈和队列)有一个很好的了解。 如果你想成为任何语言的有效程序员,那么学习这个就没有什么可替代的。

您还可以阅读Java Collections路径以开始使用。

简而言之(仅查看接口):

List – 值列表,类似于“可resize的数组”

设置 – 不允许重复的容器

Map – 键/值对的集合

地图与列表。

在Map中,您有键/值对。 要访问值,您需要知道密钥。 密钥和值之间存在关系,该关系持续存在且不是任意的。 他们以某种方式相关。 例如:人的DNA是唯一的(密钥)和人名(值)或人SSN(密钥)和人名(值)有很强的关系。

在List中,您拥有的只是值(人名),要访问它,您需要知道它在列表(索引)中的位置才能访问它。 但是列表中的值的位置与其索引之间没有永久关系,它是任意的。

这个问题最终会有一个非常复杂的答案 – 整个大学课程专门用于数据结构。 简短的回答是,他们都在内存使用和各种操作的速度上进行权衡。

什么是真正健康的是有一本关于数据结构的好书 – 我几乎可以保证,如果你对数据结构有了很好的理解,你的代码会得到显着改善。

也就是说,我可以从Java的经验中给你一些快速, 临时的建议。 对于大多数简单的内部事物,通常首选ArrayList 。 为了传递有关数据的集合,通常使用简单数组。 HashMap只适用于有一些逻辑上有理由让特殊键与值相对应的情况 – 我没有看到有人将它们用作一切的通用数据结构。 其他结构更复杂,并且倾向于在特殊情况下使用。

如您所知,它们是对象的容器。 阅读各自的API将有助于您了解它们之间的差异。

由于其他人已经描述了他们使用它们的不同之处,我将指出这个描述各种数据结构复杂性的链接 。

此列表与编程语言无关,并且一如既往,实际的实现将有所不同。

理解每个结构的各种操作的复杂性是很有用的,因为在现实世界中,如果您经常在1,000,000个元素链表中搜索未排序的对象,那将很重要。 性能不是最佳的。

Java中Set,List和Map的区别 – Set,List和Map是Java集合框架的三个重要接口,Java中Set,List和Map之间的差异是最常见的Java Collection面试问题之一。 有时候这个问题被问为何时在Java中使用List,Set和Map。 很明显,面试官希望了解您是否熟悉Java集合框架的基础知识。 为了决定何时使用List,Set或Map,您需要知道这些接口是什么以及它们提供的function。 Java中的List提供了可能包含重复项的有序和索引集合。 Set提供了无序的唯一对象集合,即Set不允许重复,而Map提供基于键值对和散列的数据结构。 所有三个List,Set和Map都是Java中的接口,并且Collection API中有许多具体的实现。 ArrayList和LinkedList是两个最常用的List实现,而LinkedHashSet,TreeSet和HashSet经常使用Set实现。 在这篇Java文章中,我们将看到Java中Map,Set和List之间的区别,并了解何时使用List,Set或Map。

在Java中设置vs列表与地图

正如我所说,Set,List和Map是接口,它定义了核心合同,例如Set合约说它不能包含重复项。 根据我们对List,Set和Map的了解,让我们根据不同的指标进行比较。

重复对象Java中List和Set接口的主要区别在于List允许重复,而Set不允许重复。 Set的所有实施都尊重这份合同。 Map为每个条目保存两个对象,例如键和值,它可能包含重复值,但键始终是唯一的。 有关Java中List和Set数据结构之间的更多区别,请参见此处。

订单List和Set之间的另一个关键区别是List是有序集合,List的契约维护插入顺序或元素。 Set是一个无序集合,您无法保证将存储哪个order元素。 虽然一些Set实现例如LinkedHashSet维护了顺序。 还有SortedSet和SortedMap,例如TreeSet和TreeMap维护一个排序顺序,使用Comparator或Comparable强加。

空元素List允许null元素,并且List中可以有许多空对象,因为它也允许重复。 设置只允许一个null元素,因为没有允许重复,而在Map中你可以有空值和最多一个空键。 值得注意的是Hashtable不允许空键或值,但HashMap允许空值和一个空键。 这也是这两个流行的Map接口实现的主要区别,又名HashMap vs Hashtable。

流行实施

Java中List接口最流行的实现是ArrayList,LinkedList和Vector类。 ArrayList更通用,提供带索引的随机访问,而LinkedList更适合频繁添加和删除List中的元素。 Vector是ArrayList的同步对应物。 另一方面,Set接口的大多数流行实现是HashSet,LinkedHashSet和TreeSet。 第一个是由HashMap支持的通用Set,请参阅HashSet如何在Java内部工作以获取更多详细信息。 它也没有提供任何订购保证,但LinkedHashSet确实提供了订购以及Set接口提供的唯一性。 第三个实现TreeSet也是SortedSet接口的一个实现,因此它将元素保存在compare()或compareTo()方法指定的排序顺序中。 现在最后一个,最流行的Map接口实现是HashMap,LinkedHashMap,Hashtable和TreeMap。 第一个是非同步的通用Map实现,而Hashtable是它的同步对应物,它们都没有提供来自LinkedHashMap的任何排序保证。 就像TreeSet一样,TreeMap也是一个排序的数据结构,并按键排序。