Java 列表、数组列表、映射、哈希映射、集合等之间的区别是什么。。?

Java 列表、数组列表、映射、哈希映射、集合等之间的区别是什么。。?,java,data-structures,Java,Data Structures,自从我再次开始用Java编程以来,我一直在使用HashMaps,但我并没有真正理解这些集合 老实说,我真的不确定一直使用HashMaps对我还是对生产代码来说是最好的。到目前为止,这对我来说并不重要,只要我能够以我在PHP中调用它们的方式获得所需的数据(是的,我承认你现在所想的任何负面事情),其中$this_is_array['this_is a_string_index']提供了调用变量数组的极大便利 现在,我已经用java工作了3个多月,遇到了我上面指定的接口,我想知道,为什么会有这么多这样

自从我再次开始用Java编程以来,我一直在使用HashMaps,但我并没有真正理解这些集合

老实说,我真的不确定一直使用HashMaps对我还是对生产代码来说是最好的。到目前为止,这对我来说并不重要,只要我能够以我在PHP中调用它们的方式获得所需的数据(是的,我承认你现在所想的任何负面事情),其中
$this_is_array['this_is a_string_index']
提供了调用变量数组的极大便利

现在,我已经用java工作了3个多月,遇到了我上面指定的接口,我想知道,为什么会有这么多这样的东西(更不用说,向量,抽象列表{哦,这个列表还在继续…})

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


更重要的是,在我的例子中,什么是最好的接口?

API非常清楚它们之间的区别和/或关系:


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

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

设置 不包含重复元素的集合。更正式地说,集合不包含e1和e2元素对,因此e1.equals(e2)最多包含一个空元素。正如它的名字所暗示的,这个接口为数学集合抽象建模

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


对于上述内容,您是否特别感到困惑?如果是,请编辑您的原始问题。谢谢。

简而言之(只看界面):

列表-值列表,类似于“可调整大小的数组”

设置-不允许重复的容器


映射-一组键/值对

这是一个最终有一个非常复杂答案的问题——整个大学课程都致力于数据结构。简而言之,它们在内存使用和各种操作的速度方面都有权衡

真正健康的做法是花些时间阅读一本关于数据结构的好书——我几乎可以保证,如果您对数据结构有了很好的理解,您的代码将得到显著改进


也就是说,我可以从我的Java经验中给你一些快速、临时的建议。对于大多数简单的内部内容,
ArrayList
通常是首选。为了传递有关的数据集合,通常使用简单数组
HashMap
只在有一些逻辑原因需要使用与值相对应的特殊键的情况下才真正被使用——我还没有看到有人将它们用作所有内容的通用数据结构。其他结构更为复杂,往往在特殊情况下使用。

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

由于其他人已经描述了它们在使用方面的差异,我将向您指出这一点,它描述了各种数据结构的复杂性

这个列表与编程语言无关,而且,和往常一样,真实世界的实现会有所不同


了解每种结构的各种操作的复杂性很有用,因为在现实世界中,如果您在1000000元素链表中不断搜索未排序的对象,这将很重要。性能不会达到最佳状态。

常见java集合的简短摘要:

“映射”:一个“映射”是一个允许存储key=>value对的容器。这样可以使用键进行快速搜索,以获取其关联值。在java.util包中有两种实现方式,“HashMap”和“TreeMap”。前者实现为,而后者实现为(因此也具有对键进行排序的属性)

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

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

为了更好地了解每个系列的优点及其性能特点,我推荐gettin
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.