我一直在使用HashMaps,因为我在Java中再次开始编程而没有真正理解这些Collections事物。
老实说,我不确定是否一直使用HashMaps对我或生产代码都是最好的。到目前为止,只要我能够以我在PHP中调用它的方式获取我需要的数据对我来说无关紧要(是的,我承认你现在正在考虑的任何负面的事情)$this_is_array['this_is_a_string_index']
提供回忆一系列变量非常方便。
所以现在,我已经使用java超过3个月了,并且遇到了我在上面指定的接口并且想知道,为什么有这么多东西(更不用说,矢量,abstractList {哦,好的列表去了上...})?
我的意思是他们彼此之间有什么不同?
更重要的是,在我的案例中使用的最佳界面是什么?
答案 0 :(得分:44)
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
有什么特别的东西让你感到困惑吗?如果是,请编辑原始问题。感谢。
答案 1 :(得分:11)
常见Java集合的简短摘要:
'Map':'Map'是一个允许存储key =>值对的容器。这使得使用密钥快速搜索以获得其关联值。 java.util包中有两个实现,'HashMap'和'TreeMap'。前者实现为hastable,而后者实现为balanced binary search tree(因此也具有对键进行排序的属性)。
'Set':'Set'是一个只包含唯一元素的容器。多次插入相同的值仍然会导致“Set”仅保存一个实例。它还提供快速操作来搜索,删除,添加,合并和计算两组的交集。与'Map'一样,它有两个实现,'HashSet'和'TreeSet'。
'List':'List'接口由'Vector','ArrayList'和'LinkedList'类实现。 “列表”基本上是保留其相对顺序的元素集合。您可以向其添加/删除元素,并访问任何给定位置的各个元素。与“地图”不同,“列表”项目由int索引,即它们的位置是“列表”(第一个元素位于第0位,最后一个位于“List.size()” - 1)。 'Vector'和'ArrayList'是使用数组实现的,而'LinkedList',顾名思义,使用linked list。需要注意的一点是,与php的关联数组(更像是Map
)不同,Java中的数组和许多其他语言实际上代表了一个连续的内存块。阵列中的元件基本上并排布置在相邻的“槽”上,可以这么说。这提供了非常快的查找和写入时间,比使用更复杂的数据结构实现的关联数组快得多。但是,与关联数组不同,除了数组中的数值位置之外,它们不能被任何其他索引编入索引。
为了更好地了解每个集合的优点及其性能特征,我建议您对数据结构(如数组,链接列表,二叉搜索树,哈希表以及堆栈和队列)有一个很好的了解。如果你想成为一名有效的任何语言的程序员,那么学习它是没有任何替代的。
您还可以阅读Java Collections小道以开始使用。
答案 2 :(得分:8)
简介(仅查看界面):
列表 - 值列表,类似于“可调整大小的数组”
设置 - 一个不允许重复的容器
地图 - 键/值对的集合
答案 3 :(得分:2)
地图与列表。
在地图中,您有键/值对。要访问值,您需要知道密钥。密钥和值之间存在关系,该关系持续存在且不是任意的。它们以某种方式相关。例如:人的DNA是唯一的(钥匙)和人名(价值)或人SSN(钥匙)和人名(价值)有很强的关系。
在列表中,您拥有的只是值(人名),要访问它,您需要知道它在列表(索引)中的位置才能访问它。但是列表中的值的位置与其索引之间没有永久关系,它是任意的。
答案 4 :(得分:1)
这个问题最终会有一个非常复杂的答案 - 整个大学课程都致力于数据结构。简短的回答是,他们都在内存使用和各种操作的速度上进行权衡。
有一些关于数据结构的好书会有什么真正健康的 - 如果你对数据结构有了很好的理解,我几乎可以保证你的代码会有很大的改进。
那就是说,我可以根据我的Java经验给你一些快速的临时建议。对于大多数简单的内部事物,ArrayList
通常是首选。为了传递有关的数据集合,通常使用简单数组。 HashMap
仅用于有某些逻辑上有理由让特殊键与值对应的情况 - 我没有看到有人将它们用作一切的通用数据结构。其他结构更复杂,往往在特殊情况下使用。
答案 5 :(得分:1)
如您所知,它们是对象的容器。阅读各自的API将有助于您了解它们之间的差异。
由于其他人已经描述了他们在使用方面的不同之处,我将向您指出link,其中描述了各种数据结构的复杂性。
这个列表与编程语言无关,并且,与往常一样,现实世界的实现会有所不同。
了解每个结构的各种操作的复杂性很有用,因为在现实世界中,如果您经常在1,000,000个元素链表中搜索未排序的对象,那将会很重要。性能不是最佳的。
答案 6 :(得分:1)
■列表-允许重复输入的元素的有序集合
具体类别:
ArrayList —标准可调整大小的列表。
LinkedList —可以轻松地从开头或结尾添加/删除。
Vector — ArrayList的旧线程安全版本。
堆栈-较先进的先进先出课程。
■设置-不允许重复
具体类别:
HashSet-使用hashcode()查找无序元素。
TreeSet-已排序且可导航。不允许为空值。
■队列-订购要处理的元素
具体类别:
LinkedList —可以轻松地从开头或结尾添加/删除。
ArrayDeque-先进先出或后进先出。不允许为空值。
■映射-将唯一键映射到值
具体类别:
HashMap —使用hashcode()查找密钥。
TreeMap —排序的地图。不允许使用空键。
Hashtable —旧版本的hashmap。不允许使用空键或空值。
答案 7 :(得分:0)
列表Vs设置Vs映射 1)重复性:列表允许重复的元素。可以在列表中插入任意数量的重复元素,而不会影响相同的现有值及其索引。 集不允许重复。 Set和实现Set接口的所有类都应具有唯一元素。 Map将元素存储为键和值对。地图不允许重复的键,而允许重复的值。
2)空值:列表允许任意数量的空值。 Set最多允许单个空值。 Map最多可以有一个空键,也可以有任意数量的空值。
3)顺序:列表及其所有实现类维护插入顺序。
Set不会维持任何顺序;它的类中仍然很少有类按元素对元素进行排序,例如LinkedHashSet会按插入顺序维护元素。
与Set Map相似,它也不会按顺序存储元素,但是很少有类会这样做。例如TreeMap以键的升序对地图进行排序,LinkedHashMap以插入顺序(将元素添加到LinkedHashMap的顺序)对元素进行排序。enter code here
答案 8 :(得分:0)
List Vs Set Vs Map
1) Duplicity: List allows duplicate elements. Any number of duplicate elements can be inserted into the list without affecting the same existing values and their indexes.
Set doesn’t allow duplicates. Set and all of the classes which implements Set interface should have unique elements.
Map stored the elements as key & value pair. Map doesn’t allow duplicate keys while it allows duplicate values.
2) Null values: List allows any number of null values.
Set allows single null value at most.
Map can have single null key at most and any number of null values.
3) Order: List and all of its implementation classes maintains the insertion order.
Set doesn’t maintain any order; still few of its classes sort the elements in an order such as LinkedHashSet maintains the elements in insertion order.
Similar to Set Map also doesn’t stores the elements in an order, however few of its classes does the same. For e.g. TreeMap sorts the map in the ascending order of keys and LinkedHashMap sorts the elements in the insertion order, the order in which the elements got added to the LinkedHashMap.
答案 9 :(得分:-1)
Java中Set,List和Map之间的区别 - Set,List和Map是Java集合框架的三个重要接口,Java中Set,List和Map之间的区别是最常见的Java Collection面试问题之一。有时这个问题被问为何时在Java中使用List,Set和Map。很明显,面试官希望知道您是否熟悉Java集合框架的基础知识。为了决定何时使用List,Set或Map,您需要知道这些接口是什么以及它们提供了哪些功能。 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合同说它不能包含重复项。根据我们对列表,设置和地图的了解,让我们根据不同的指标进行比较。
重复对象 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对象,因为它也允许重复。设置只允许一个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也是一个排序的数据结构,并按键排序。