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

收藏

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

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]删除
最新教程 更多>
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-07-10
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-07-10
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-07-10
  • 编译器报错“usr/bin/ld: cannot find -l”解决方法
    编译器报错“usr/bin/ld: cannot find -l”解决方法
    错误:“ usr/bin/ld:找不到-l “ 此错误表明链接器在链接您的可执行文件时无法找到指定的库。为了解决此问题,我们将深入研究如何指定库路径并将链接引导到正确位置的详细信息。添加库搜索路径的一个可能的原因是,此错误是您的makefile中缺少库搜索路径。要解决它,您可以在链接器命令中添加...
    编程 发布于2025-07-10
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-07-10
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-07-10
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-07-10
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-07-10
  • 为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    为什么PHP的DateTime :: Modify('+1个月')会产生意外的结果?
    使用php dateTime修改月份:发现预期的行为在使用PHP的DateTime类时,添加或减去几个月可能并不总是会产生预期的结果。正如文档所警告的那样,“当心”这些操作的“不像看起来那样直观。 考虑文档中给出的示例:这是内部发生的事情: 现在在3月3日添加另一个月,因为2月在2001年只有2...
    编程 发布于2025-07-10
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-07-10
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-07-10
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-07-10
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-07-10
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-07-10
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-07-10

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

Copyright© 2022 湘ICP备2022001581号-3