”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 收藏

收藏

发布于2024-08-10
浏览:710

Collection接口定义了列表、向量、堆栈、队列、优先级队列和集合的常见操作。

Java Collections Framework 支持两种类型的容器:

  • 用于存储元素集合的一个简称为集合
  • 另一个用于存储键/值对,称为map

映射是使用键快速搜索元素的高效数据结构。以下是以下合集。

  • 集合存储一组不重复的元素。
  • 列表存储元素的有序集合。
  • 堆栈存储以后进先出方式处理的对象。
  • 队列存储以先进先出方式处理的对象。
  • PriorityQueue存储按优先级顺序处理的对象。

这些集合的共同特征在接口中定义,并在具体类中提供实现,如下图所示。

Image description

Java Collections Framework 中定义的所有接口和类都分组在 java.util 包中。

Java Collections Framework 的设计是使用接口、抽象类和具体类的一个很好的例子。接口定义了框架。抽象类提供部分实现。具体类用具体数据结构实现接口。提供部分实现接口的抽象类可以方便用户编写代码。用户可以简单地定义一个扩展抽象类的具体类,而不是实现接口中的所有方法。为了方便起见,提供了诸如 AbstractCollection 之类的抽象类。因此,它们被称为便利抽象类。

Collection接口是操作对象集合的根接口。其公共方法如下图所示。 AbstractCollection 类提供 Collection 接口的部分实现。它实现了 Collection 中除 addsizeiterator 方法之外的所有方法。这些在适当的具体子类中实现。

Image description

Collection接口提供了在集合中添加和删除元素的基本操作。 add 方法向集合添加一个元素。 addAll 方法将指定集合中的所有元素添加到此集合中。 remove 方法从集合中删除一个元素。 removeAll 方法从此集合中删除指定集合中存在的元素。 retainAll 方法保留此集合中也存在于指定集合中的元素。所有这些方法都返回 boolean。如果集合因方法执行而更改,则返回值为 trueclear() 方法只是从集合中删除所有元素。

方法addAllremoveAllretainAll与集合的并集、差集和交集操作类似。

Collection接口提供了各种查询操作。 size 方法返回集合中元素的数量。 contains 方法检查集合是否包含指定元素。 containsAll 方法检查集合是否包含指定集合中的所有元素。如果集合为空,isEmpty 方法将返回 true

Collection 接口提供了 toArray() 方法,该方法返回集合的数组表示形式。

Collection接口中的一些方法无法在具体子类中实现。在这种情况下,该方法将抛出 java.lang.UnsupportedOperationException,它是 RuntimeException 的子类。这是一个很好的设计,您可以在您的项目中使用。如果某个方法在子类中没有意义,可以按如下方式实现:

public void someMethod() {
抛出新的 UnsupportedOperationException
(“不支持该方法”);
}

下面的代码给出了使用Collection接口中定义的方法的示例。

package demo;
import java.util.*;

public class TestCollection {

    public static void main(String[] args) {
        ArrayList collection1 = new ArrayList();
        collection1.add("New York");
        collection1.add("Atlanta");
        collection1.add("Dallas");
        collection1.add("Madison");

        System.out.println("A list of cities in collection1:");
        System.out.println(collection1);

        System.out.println("\nIs Dallas in collection1? "   collection1.contains("Dallas"));

        collection1.remove("Dallas");
        System.out.println("\n"   collection1.size()   " cities are in collection1 now");

        Collection collection2 = new ArrayList();
        collection2.add("Seattle");
        collection2.add("Portland");
        collection2.add("Los Angeles");
        collection2.add("Atlanta");

        System.out.println("\nA list of cities in collection2:");
        System.out.println(collection2);

        ArrayList c1 = (ArrayList)(collection1.clone());
        c1.addAll(collection2);
        System.out.println("\nCities in collection1 or collection2: ");
        System.out.println(c1);

        c1 = (ArrayList)(collection1.clone());
        c1.retainAll(collection2);
        System.out.print("\nCities in collection1 and collection2: ");
        System.out.println(c1);

        c1 = (ArrayList)(collection1.clone());
        c1.removeAll(collection2);
        System.out.print("\nCities in collection1, but not in 2: ");
        System.out.println(c1);
    }

}

集合中的城市列表1:
[纽约、亚特兰大、达拉斯、麦迪逊]
达拉斯在收藏1吗?真的
现已收集 3 个城市1
集合中的城市列表2:
[西雅图、波特兰、洛杉矶、亚特兰大]
集合 1 或集合 2 中的城市:
[纽约、亚特兰大、麦迪逊、西雅图、波特兰、洛杉矶、亚特兰大]
集合 1 和集合 2 中的城市:[亚特兰大]
城市在集合 1 中,但不在集合 2 中:[纽约、麦迪逊]

程序使用ArrayList创建一个具体的集合对象(第7行),并调用Collection接口的contains方法(第16行), remove 方法(第 18 行)、size 方法(第 19 行)、addAll 方法(第 31 行)、retainAll 方法(第 36 行),以及removeAll 方法(第 41 行)。

对于这个例子,我们使用ArrayList。您可以使用 Collection 的任何具体类,例如 HashSetLinkedListVectorStack 来替换ArrayList 测试 Collection 接口中定义的这些方法。

程序创建数组列表的副本(第 30、35、40 行)。这样做的目的是保持原始数组列表不变,并使用其副本执行 addAllretainAllremoveAll 操作。

Java Collections Framework 中的所有具体类都实现了 java.lang.Cloneablejava.io.Serialized 接口,除了 java.util.PriorityQueue 未实现 Cloneable 接口。因此,除优先级队列之外的所有 Cloneable 实例都可以被克隆,并且 Cloneable 的所有实例都可以被序列化。

版本声明 本文转载于:https://dev.to/paulike/collections-3le7?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Polyfills——填充物还是缝隙? (第 1 部分)
    Polyfills——填充物还是缝隙? (第 1 部分)
    几天前,我们在组织的 Teams 聊天中收到一条优先消息,内容如下:发现安全漏洞 - 检测到 Polyfill JavaScript - HIGH。 举个例子,我在一家大型银行公司工作,你必须知道,银行和安全漏洞就像主要的敌人。因此,我们开始深入研究这个问题,并在几个小时内解决了这个问题,我将在下面...
    编程 发布于2024-11-05
  • 移位运算符和按位简写赋值
    移位运算符和按位简写赋值
    1。移位运算符 :向右移动。 >>>:无符号右移(零填充)。 2.移位运算符的一般语法 value > num-bits:将值位向右移动,保留符号位。 value >>> num-bits:通过在左侧插入零将值位向右移动。 3.左移 每次左移都会导致该值的所有位向左移动一位。 右侧插入0位。 效果:...
    编程 发布于2024-11-05
  • 如何使用 VBA 从 Excel 建立与 MySQL 数据库的连接?
    如何使用 VBA 从 Excel 建立与 MySQL 数据库的连接?
    VBA如何在Excel中连接到MySQL数据库?使用VBA连接到MySQL数据库尝试连接使用 VBA 在 Excel 中访问 MySQL 数据库有时可能具有挑战性。在您的情况下,您在尝试建立连接时遇到错误。要使用 VBA 成功连接到 MySQL 数据库,请按照下列步骤操作:Sub ConnectDB...
    编程 发布于2024-11-05
  • 测试自动化:使用 Java 和 TestNG 进行 Selenium 指南
    测试自动化:使用 Java 和 TestNG 进行 Selenium 指南
    测试自动化已成为软件开发过程中不可或缺的一部分,使团队能够提高效率、减少手动错误并以更快的速度交付高质量的产品。 Selenium 是一个用于自动化 Web 浏览器的强大工具,与 Java 的多功能性相结合,为构建可靠且可扩展的自动化测试套件提供了一个强大的框架。使用 Selenium Java 进...
    编程 发布于2024-11-05
  • 我对 DuckDuckGo 登陆页面的看法
    我对 DuckDuckGo 登陆页面的看法
    “你为什么不谷歌一下呢?”是我在对话中得到的常见答案。谷歌的无处不在甚至催生了新的动词“谷歌”。但是我编写的代码越多,我就越质疑我每天使用的数字工具。也许我对谷歌使用我的个人信息的方式不再感到满意。或者我们很多人依赖谷歌进行互联网搜索和其他应用程序,说实话,我厌倦了在搜索某个主题或产品后弹出的广告,...
    编程 发布于2024-11-05
  • 为什么 Turbo C++ 的“cin”只读取第一个字?
    为什么 Turbo C++ 的“cin”只读取第一个字?
    Turbo C 的“cin”限制:仅读取第一个单词在 Turbo C 中,“cin”输入运算符有一个处理字符数组时的限制。具体来说,它只会读取直到遇到空白字符(例如空格或换行符)。尝试读取多字输入时,这可能会导致意外行为。请考虑以下 Turbo C 代码:#include <iostream....
    编程 发布于2024-11-05
  • 使用 Buildpack 创建 Spring Boot 应用程序的 Docker 映像
    使用 Buildpack 创建 Spring Boot 应用程序的 Docker 映像
    介绍 您已经创建了一个 Spring Boot 应用程序。它在您的本地计算机上运行良好,现在您需要将该应用程序部署到其他地方。在某些平台上,您可以直接提交jar文件,它将被部署。在某些地方,您可以启动虚拟机,下载源代码,构建并运行它。但是,大多数时候您需要使用容器来部署应用程序。大...
    编程 发布于2024-11-05
  • 如何保护 PHP 代码免遭未经授权的访问?
    如何保护 PHP 代码免遭未经授权的访问?
    保护 PHP 代码免遭未经授权的访问保护 PHP 软件背后的知识产权对于防止其滥用或盗窃至关重要。为了解决这个问题,可以使用多种方法来混淆和防止未经授权的访问您的代码。一种有效的方法是利用 PHP 加速器。这些工具通过缓存频繁执行的部分来增强代码的性能。第二个好处是,它们使反编译和逆向工程代码变得更...
    编程 发布于2024-11-05
  • React:了解 React 的事件系统
    React:了解 React 的事件系统
    Overview of React's Event System What is a Synthetic Event? Synthetic events are an event-handling mechanism designed by React to ach...
    编程 发布于2024-11-05
  • 为什么在使用 Multipart/Form-Data POST 请求时会收到 301 Moved Permanently 错误?
    为什么在使用 Multipart/Form-Data POST 请求时会收到 301 Moved Permanently 错误?
    Multipart/Form-Data POSTs尝试使用 multipart/form-data POST 数据时,可能会出现类似所提供的错误消息遭遇。理解问题需要检查问题的构成。遇到的错误是 301 Moved Permanently 响应,表明资源已被永久重定向。当未为 multipart/f...
    编程 发布于2024-11-05
  • 如何使用日期和时间对象确定 PHP 中的时间边界?
    如何使用日期和时间对象确定 PHP 中的时间边界?
    确定 PHP 中的时间边界在此编程场景中,我们的任务是确定给定时间是否在预定义的范围内。具体来说,我们得到三个时间字符串:当前时间、日出和日落。我们的目标是确定当前时间是否位于日出和日落的边界时间之间。为了应对这一挑战,我们将使用 DateTime 类。这个类使我们能够表示和操作日期和时间。我们将创...
    编程 发布于2024-11-05
  • 如何使用 CSS 变换比例修复 jQuery 拖动/调整大小问题?
    如何使用 CSS 变换比例修复 jQuery 拖动/调整大小问题?
    jQuery 使用 CSS 变换缩放拖动/调整大小问题: 当应用 CSS 变换时,特别是变换:矩阵(0.5, 0, 0, 0.5, 0, 0);,对于一个 div 并在子元素上使用 jQuery 的draggable() 和 resizing() 插件,jQuery 所做的更改变得与鼠标位置“不同步...
    编程 发布于2024-11-05
  • 如何修复 TensorFlow 中的“ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型浮点)”错误?
    如何修复 TensorFlow 中的“ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型浮点)”错误?
    TensorFlow:解决“ValueError: Failed to Convert NumPy Array to Tensor (Unsupported Object Type Float)”工作时遇到的常见错误TensorFlow 的错误是“ValueError:无法将 NumPy 数组转换为...
    编程 发布于2024-11-05
  • 如何高效判断本地存储项是否存在?
    如何高效判断本地存储项是否存在?
    确定本地存储项目是否存在使用 Web 存储时,在访问或修改特定项目之前验证它们是否存在至关重要。在本例中,我们想要确定 localStorage 中是否设置了特定项目。当前方法检查项目是否存在的当前方法似乎是:if (!(localStorage.getItem("infiniteScro...
    编程 发布于2024-11-05
  • Java 中的原子是什么?了解 Java 中的原子性和线程安全
    Java 中的原子是什么?了解 Java 中的原子性和线程安全
    1. Java 原子简介 1.1 Java 中什么是原子? 在Java中,java.util.concurrent.atomic包提供了一组支持对单个变量进行无锁线程安全编程的类。这些类统称为原子变量。最常用的原子类包括 AtomicInteger 、 Atomic...
    编程 发布于2024-11-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3