使用集合框架存储数据
介绍集合框架
集合框架是 JDK 中使用最广泛的 API。无论您正在处理什么应用程序,您很可能在某个时候需要在内存中存储和处理数据。
数据结构的历史几乎与计算本身一样悠久。集合框架是关于如何在内存中存储、组织和访问数据的概念的实现,这些概念是在 Java 出现之前很久就开发出来的。正如您将看到的那样,集合框架以非常有效的方式做到了这一点。
集合框架最初是在 1998 年的 Java SE 2 中引入的,此后又重写了两次
- 在 Java SE 5 中添加泛型时;
- 在 Java 8 中引入 lambda 表达式以及接口中的默认方法时。
这两个是迄今为止对集合框架进行的最重要的更新。但事实上,几乎每个版本的 JDK 都有对集合框架的一系列更改。
您将在本部分中学习的是集合框架提供的最有用的数据结构,以及您将在应用程序中用来操作这些数据的模式。
您需要了解的第一件事是,从技术角度来看,集合框架是一组接口,这些接口模拟了以不同类型容器存储数据的不同方式。然后框架为每个接口提供至少一个实现。了解这些实现与接口一样重要,选择合适的实现取决于您需要用它做什么。
在集合框架中找到您的方向
集合框架中的接口和类数量一开始可能会让人不知所措。确实,有许多结构可用,包括类和接口。有些名称不言自明,例如 LinkedList
,有些带有行为,例如 ConcurrentHashMap
,有些可能听起来很奇怪,例如 ConcurrentSkipListMap
.
您将比其他元素更频繁地使用其中的一些元素。如果您已经熟悉 Java 语言,您可能已经遇到过 List
、ArrayList
和 Map
。本教程重点介绍集合框架中最常用的结构,这些结构是您作为 Java 开发人员每天都会使用的结构,并且您需要最了解和理解的结构。
话虽如此,您需要了解集合框架中为您提供了哪些内容。
首先,框架由接口和实现组成。选择正确的接口意味着您需要知道要为应用程序带来哪些功能。您需要的是否包括
- 存储对象并遍历它们?
- 将您的对象推入队列并弹出它们?
- 使用键检索它们?
- 通过它们的索引访问它们?
- 对它们进行排序?
- 防止出现重复项或空值?
选择正确的实现意味着您需要知道将如何使用这些功能
- 访问您的对象将通过迭代完成,还是随机的、索引访问?
- 对象将在应用程序启动时固定,并且在其生命周期内不会发生太大变化?
- 对象的数量是否很重要,需要进行大量检查以确定是否存在某些对象?
- 您需要存储对象的结构将被并发访问吗?
集合框架可以为您提供所有这些问题的正确解决方案。
集合框架中有两大类接口:集合和映射。
集合是关于存储对象并遍历它们。该 Collection
接口是此类别的根接口。事实上,该 Collection
接口扩展了该 Iterable
接口,但此接口不是集合框架的一部分。
映射将对象与其键一起存储,该键表示该对象,就像主键在数据库中表示对象一样,如果您熟悉此概念。有时您会听到映射存储键/值对,这正是映射所做的描述。该 Map
接口是此类别的根接口。
该 Collection
层次结构和该 Map
层次结构之间没有直接关系。
除了这些集合和映射之外,您还需要知道,您可以在该 Collection
层次结构中找到用于模拟队列和堆栈的接口。队列和堆栈并不是真正关于遍历对象集合,但由于它们已添加到该 Collection
层次结构中,因此您可以使用它们来做到这一点。
还有一个您需要了解的最后一个层次结构,即 Iterator
层次结构。迭代器是一个可以遍历对象集合的对象,它是集合框架的一部分。
这使得两大类,Collection
和 Map
,一个子类别,Queue
,以及一个侧类别,Iterator
.
避免使用旧的接口和实现
集合框架只是在 Java 2 中引入的,这意味着它之前存在过。这种生活包括几个仍然存在于 JDK 中的类和接口,以保持向后兼容性,但您不应该再在应用程序中使用它们。
这些类和接口如下
Vector
和Stack
。该Vector
类已被改装为实现该List
接口。如果您在非并发环境中使用向量,那么您可以安全地用ArrayList
替换它。该Stack
类扩展了Vector
并且应该在非并发环境中被ArrayDeque
替换。- 该
Vector
类使用该Enumeration
接口来模拟其迭代器。此接口不应该再使用:首选接口现在是Iterator
接口。 HashTable
:此类已被改装为实现该Map
接口。如果您在非并发环境中使用此类的实例,那么您可以安全地用HashMap
替换它。在并发环境中,ConcurrentHashMap
可以用作替代品。
为什么要选择集合而不是数组?
您可能想知道为什么您应该费心学习集合框架,因为您可能有一种感觉,将您的数据放入一个老式的数组就可以完成工作。
事实上,在任何情况下,如果您有一个简单、掌握良好且符合您需求的解决方案,那么您绝对应该坚持使用它!
集合可以为您做些什么,而数组做不到?
- 集合跟踪它包含的元素数量
- 集合的容量没有限制:您可以在集合中添加(几乎)任意数量的元素
- 集合可以控制您可能存储在其中的元素。例如,您可以防止添加空元素
- 集合可以查询给定元素的存在
- 集合提供诸如与另一个集合相交或合并之类的操作。
这只是集合可以为您做的事情的一个小样本。事实上,由于集合是一个对象,并且考虑到对象是可扩展的,您可以在 JDK 提供的大多数集合上添加任何您需要的操作。这在数组中是不可能的,因为数组在 Java 中不是对象。
最后更新: 2021 年 9 月 14 日