处理数据数组及其结构、搜索它们之间的对应关系、过滤——所有这些都是用 Java 编写的任何程序的基础。这就是为什么程序员必须在他们的武器库中拥有使处理这些数据尽可能简单和结构化的工具的原因。这就是 Java 框架集合发挥作用的地方。
什么是集合框架?
这是一组不同的接口,用于在 Java 编程中处理对象组。集合允许您操作数组、队列、列表、映射和其他对象类型。
Java 中的所有集合都是严格结构化的:一些接口从属于其他接口,而后者扩展了它们在层次结构中的“老大哥”的功能。
Java Collections Framework 的层次结构基于 Collection 接口,它是总体接口。通用集合可容纳所有其他类型的集合,并允许您使用主要方法来处理对象组,其中包括:
- add(…);
- remove(…);
- clear(…)。
Collection 接口继承自 Iterable,这意味着从属于它的所有集合都是可迭代的,无论其实现类型如何。因此,您可以在 Collection 中获得一个迭代器,该迭代器允许您迭代其他集合接口。
迭代器将允许您遍历其他集合接口
Collection 接口具有三个主要接口:
- Set – 允许您使用数据集
- List – 与数据列表交互
- Queue – 与队列一起使用
Map接口适用于键值数据。它是单独列出的,我稍后会解释为什么会这样。现在,让我们浏览一下主要的集合类型,并找出每个集合的作用。
List 接口及其实现:ArrayList 和 LinkedList
列表是一个有序集合,最常用于 Java 集合框架。此接口控制每个列表项的插入位置。使用 List 时,用户通过其整数索引(列表中的位置)访问列表项。
使用列表界面
List 接口有两个标准实现:ArrayList 和 LinkedList。
关键是您可以编写其他实现,但 JDK 已经有两个开箱即用。
ArrayList 包含一个数组,当向其中添加新元素时,其长度会自动增加。
List 接口的第二个实现是 LinkedList 类。这是一个包含两个链接的列表,其中每个元素都包含指向列表中前面和后面元素的链接。
List 接口的第二个实现是 LinkedList 类
ArrayList 和 LinkedList 是相同的;也就是说,它们的方法完全相同。它们都可以从列表的任何部分添加和提取元素。那么有什么区别呢?它们之间的主要区别在于操作的圈复杂度——通过程序代码的线性独立路由点的数量。每个单独的命令通过的路径点数越少,程序运行的速度就越快。
为了说明这两个类之间圈复杂度的差异,请考虑下表:
LinkedList 和 ArrayList 类之间圈复杂度的差异
如您所见,LinkedList 类的主要优点与操作(iterator.remove() 和 ListIterator.add(E element) 有关。它们的圈复杂度将始终为 O(1)。在 add(E element) 的情况下) 使用 LinkedList 更好,但对于 get(int index),ArrayList 更好。
这同样适用于 add(int index, E element) 运算符。仅当索引本身为零时,LinkedList 的此操作的圈复杂度才较低。对于所有其他情况,使用 ArrayList 更为合理。
这同样适用于删除操作:对于 LinkedList 类,其圈复杂度将是 ArrayList 的一半。展望未来,绝大多数 List 接口操作中使用的是 ArrayList。
接口集
Set 是一个不包含重复元素的集合。该接口旨在对数学集的抽象进行建模。
Set 层次结构包括两个接口,SortedSet 和 NavigableSet,以及三个主要类。我将更详细地描述后者:
- HashSet是一个不允许存储相同元素的集合,因为它包含 HashMap 对象。它使用哈希表来存储数据。
- LinkedHashSet类似于 HashSet,其中元素在有序列表中相互组合。在这种情况下,元素的存储顺序与它们添加的顺序相同(由于 LinkedHashMap 对象的内容)。
- TreeSet是一个使用按值排序的树来存储项目的集合。TreeSet 包含TreeMap,一个使用平衡的红黑二叉树来存储其元素的集合。因此,此集合中的添加、删除和包含操作的保证时间等于 log(n)。与 Set 接口的其他实现相比,这是一个显着的优势。
接口队列
我们都不喜欢排队——谁喜欢浪费时间等待某事?但是如果你学会了如何使用队列,你肯定会喜欢它们?在Java Collections Framework中,队列接口负责使用队列,它具有相当简单的层次结构:
队列可以根据两种基本类型对队列中的元素进行排序:
- 使用构造函数中获取的 Comparator 接口,将队列中的新对象与之前的对象进行比较
- 使用 Comparable 接口,这是根据元素的自然顺序排列元素所必需的
界面图
这是一个旨在处理键值数据的集合。关键是指我们用来检索它包含的数据的对象。在结构上, Map 不继承 Iterable 集合,并且具有几个独特的方法。
此接口具有类似于 Set 的类层次结构。Map 使用四种实现方式实现:HashMap、TreeMap(我在上面写过)、LinkedHashMap 和 WeakHashMap:
- LinkedHashMap 扩展了 HashMap 的功能,可以按照原始顺序组织元素的枚举。也就是说,在对 LinkedHashMap 方法进行迭代时,所有对象都将按照它们添加的严格顺序返回。
- WeakHashMap 是一个用它们的键组织弱对象引用的类。它用于动态对象。例如,在构建具有垃圾收集功能的系统时。它不包含在要删除的对象列表中,因为垃圾收集器在检测它包含的对象时会忽略它。
Java 中的集合非常广泛。它们包含很多接口和实现,每一个都值得单独写一篇文章。
同时,Java 集合框架包括编写任何复杂的多任务代码所需的所有功能。
正确理解使用集合的原则仍然是高质量 Java 编程的主要技能之一。NIX United是一家位于佛罗里达州的软件开发公司,其团队中有经验丰富的 Java 程序员,他们很乐意回答您有关 Java Collections Framework 的问题。