JAVA 集合框架(一) Collection集合详解和常用方法

devtools/2024/9/20 7:28:24/ 标签: java, python, windows

Java集合框架(Java Collections Framework)是一个强大的、高度灵活的数据结构库,它为Java应用程序提供了组织、存储和操作对象集合的标准方法。

集合类体系结构

集合类体系结构

接口类:

  • Collection: 是单例集合类的顶层接口,包括List、Set。
  • Map: 存储键值对(key-value pairs)的数据结构,不允许键重复,例如HashMap、TreeMap和LinkedHashMap。
  • List: 有序的、可重复的元素序列,允许通过索引进行访问,例如ArrayList、LinkedList和Vector。
  • Set: 不包含重复元素的集合,不保证元素的顺序,如HashSet、LinkedHashSet和TreeSet。

实现类:

  • ArrayList:基于动态数组实现,支持快速随机访问元素,但在插入和删除时可能需要移动大量元素。
  • LinkedList:基于链表实现,插入和删除操作更快,但随机访问相对较慢。
  • HashSet:基于哈希表实现,不允许重复元素,不保证元素的顺序。
  • TreeSet:基于红黑树实现,不允许重复元素且自动排序。
  • HashMap:基于哈希表实现,存储键值对,允许快速存取,键不能重复。
  • TreeMap:基于红黑树实现,存储键值对,键不能重复且自动排序。

Collection集合

java.util.Collection接口是所有单列集合(即只包含元素,不包含键值对)的顶层接口,它是Java集合框架的基础。它定义了集合对象的基本行为和操作,如添加元素、删除元素、检测集合是否为空、查询集合大小等。所有实现了 Collection 接口的类,如 ListSet,都遵循同样的基本操作。

创建Collection集合的对象

  • 接口无法直接创建,需要使用多态的方式创建

代码示例:

java">//创建集合对象
Collection<String> c = new ArrayList<>();

Collection集合常用方法

添加元素:
  • boolean add(E e): 将指定元素添加到集合中,如果集合因添加而发生改变则返回 true,否则返回 false。
java">// 创建一个 ArrayList 实例,ArrayList 是 Collection 接口的实现类
Collection<String> list = new ArrayList<>();// 添加元素
boolean res = list.add("Banana"); // 结果: true
  • boolean addAll(Collection<? extends E> c): 将指定集合中的所有元素添加到当前集合中,如果集合因添加而发生改变则返回 true,否则返回 false。
java">// 创建第一个 ArrayList 实例
Collection<String> list1 = new ArrayList<>();
list1.add("Apple");
list1.add("Banana");
list1.add("Cherry");// 创建第二个 ArrayList 实例
Collection<String> list2 = new ArrayList<>();
list2.add("Durian");
list2.add("Elderberry");
list2.add("Fig");// 使用 addAll() 方法将 list2 中的所有元素添加到 list1 中
Collection<String> collection1 = list1;
collection1.addAll(list2);// 输出合并后的 list1
System.out.println("合并后的 list: " + list1);
删除元素:
  • boolean remove(Object o): 从集合中移除指定元素,如果集合因移除而发生改变则返回 true,否则返回 false。
java">// 创建第一个 ArrayList 实例
Collection<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");// 删除元素
list.remove("Banana");
System.out.println("删除'Banana'后: " + list);
  • boolean removeAll(Collection<?> c): 从当前集合中移除与指定集合中相交的所有元素,如果集合因移除而发生改变则返回 true,否则返回 false。
java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));// 创建另一个 ArrayList
Collection<String> toRemove = new ArrayList<>(Arrays.asList("Banana", "Date"));// 输出原始 fruits 集合
System.out.println("原集合: " + list);// 使用 removeAll() 方法移除 fruits 中与 toRemove 相同的元素
Collection<String> collection = list;
collection.removeAll(toRemove);// 输出移除元素后的 fruits 集合
System.out.println("移除元素后的集合: " + list);
查询操作:
  • boolean contains(Object o): 判断集合中是否包含指定的元素。
java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));// 检查集合是否包含某个元素
System.out.println("集合中是否包含 'Banana'? " + list.contains("Banana"));
  • boolean containsAll(Collection<?> c): 判断当前集合是否包含指定集合中的所有元素。
java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));// 创建另一个 ArrayList
Collection<String> toContains = new ArrayList<>(Arrays.asList("Banana", "Date"));boolean res = list.containsAll(toContains);// 检查集合是否包含某个元素
System.out.println("第一个集合中是否包含第二个数组中的元素 ? " + res);
  • boolean isEmpty(): 判断集合是否为空。
java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>();
// 判断集合是否为空
boolean res = list.isEmpty();
System.out.println("集合是否为空? " + res);// 结果为:true
  • int size(): 返回集合中元素的个数。
java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));// 获取集合的长度
int size = list.size();
System.out.println("集合的长度为: " + size);
其它操作:
  • Object[] toArray(): 返回一个包含集合中所有元素的数组。
java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));
// 集合转数组
Object[] arr = list.toArray();
// 遍历数组
for (Object ele : arr) {System.out.println(ele);
}
  • <T> T[] toArray(T[] a): 将集合转换为指定类型的数组。
    • <T>:表示泛型,代表集合中元素的实际类型,这个类型会被用来创建返回的数组。
    • T[] a:参数是一个对象数组,其元素类型与集合中的元素类型相同。如果传入的数组足够大(即长度大于等于集合的大小),那么集合的元素将被复制到这个数组中,并返回这个数组。如果传入的数组太小,系统会创建一个新的数组,大小正好足以容纳集合中的所有元素,并返回这个新数组。
java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));
// 使用toArray()方法将集合转换为String数组
String[] array = list.toArray(new String[0]);
// 遍历数组
for (String str : array) {System.out.println(str);
}
  • void clear(): 清除集合中的所有元素。
java"> // 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));
// 清空集合
list.clear();
System.out.println("输出清空后的集合: "+list); // 结果为: []

遍历Collection集合

Collection集合的遍历可以通过多种方式进行,以下是几种常见的遍历方法:

迭代器(Iterator)方式:

迭代器(Iterator)是用于遍历集合(包括SetList等实现Collection接口的类)中元素的一种设计模式。迭代器提供了一种统一的方式来访问集合中的元素,无需关心集合底层的具体实现。

迭代器的工作原理:

  1. 获取迭代器: 要遍历一个Collection集合,首先需要获取该集合的迭代器。这通常通过调用集合的iterator()方法实现:
java">Collection<String> collection = new ArrayList<>();
// ... 添加元素到collection ...
// 获取迭代器
Iterator<String> iterator = collection.iterator();
  1. 迭代过程: 迭代器提供了如下三个基本方法来进行遍历操作:
    • boolean hasNext(): 检查集合中是否还有更多的元素可以迭代。如果有,则返回true,否则返回false。
    • E next(): 如果集合中还有元素,则返回下一个元素,并将迭代器内部的指针向前移动一位。如果没有更多的元素,将抛出NoSuchElementException
    • void remove(): 移除上次调用next()方法返回的元素。注意,此方法只能在调用next()之后使用,并且不能在调用next()之前或两次next()之间调用

使用迭代器遍历集合的示例:

java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 检测集合中是否还有元素, 取空停止循环
while (iterator.hasNext()){// 取出元素,并把指针向后移动一位String item = iterator.next();System.out.println(item);
}

迭代器的优点

  • 抽象了遍历集合的行为,使得无论集合内部数据结构,都可以采用统一的方式来遍历元素。
  • 提供了灵活的遍历控制,比如可以根据条件决定是否继续遍历或删除当前元素。
  • 支持fail-fast机制,在迭代过程中,如果集合发生了结构性修改(如添加、删除元素),将会立即抛出ConcurrentModificationException,防止了数据一致性问题。
增强型for循环(foreach)方式:

增强型for循环(也称作foreach循环)是Java 5引入的简洁遍历集合的方式,语法简洁易读,不需要显式调用迭代器。

java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));
// foreach方式遍历集合
for (String str : list) {System.out.println(str);
}
Stream API 方式:

Java 8引入的Stream API可以对集合进行流式处理,这里通过stream()方法将集合转换为Stream,然后调用forEach()方法进行遍历并处理每个元素。

java">// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));
// 使用Stream API方式遍历集合
list.stream().forEach(System.out::println);
传统的for循环遍历索引(仅限List接口实现类):

对于List接口的实现类,如ArrayListLinkedList等,还可以通过传统for循环遍历索引的方式来访问元素,但这种方法并不适用于Set接口的实现类,因为Set接口的实现类不具备索引访问能力。

java">// 创建一个 ArrayList
ArrayList<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));
// 使用传统for循环遍历List集合
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));
}

http://www.ppmy.cn/devtools/5004.html

相关文章

09-ARM开发板的HelloWorld

在ARM开发板上运行x86_64平台程序 前面在Ubuntu系统编译生成了X86_64平台的HelloWorld程序&#xff0c;通过NFS服务器&#xff0c;尝试在开发板上直接运行。 如图所示&#xff0c;程序无法正常运行&#xff0c;终端提示ARM开发板在执行x86架构&#xff08;Intel或AMD&#xff…

centos7安装openGauss数据库企业版

本文章是在CentOS7虚拟机上安装openGauss企业版数据库流程 1.下载安装包: https://opengauss.org/zh/download/ openGauss-5.0.1-CentOS-64bit-all.tar.gz 2.安装python3.6.9 见我的另一篇文章 CentOS7安装Python3-CSDN博客 3.检查工具依赖&#xff1a; 分别检查以下工具是…

部署ELFK+zookeeper+kafka架构

目录 前言 一、环境部署 二、部署ELFK 1、ELFK ElasticSearch 集群部署 1.1 配置本地hosts文件 1.2 安装 elasticsearch-rpm 包并加载系统服务 1.3 修改 elasticsearch 主配置文件 1.4 创建数据存放路径并授权 1.5 启动elasticsearch是否成功开启 1.6 查看节点信息 …

使用Python实现超参数调优

超参数调优是机器学习模型调优过程中的重要步骤&#xff0c;它可以帮助我们找到最佳的超参数组合&#xff0c;从而提高模型的性能和泛化能力。在本文中&#xff0c;我们将介绍超参数调优的基本原理和常见的调优方法&#xff0c;并使用Python来实现这些方法。 什么是超参数&…

面试题:Kafka中Controller的作用是什么?选举流程是怎样的?以及如何避免脑裂问题?

题目来源 网上冲浪&#xff1a;还不懂分布系统&#xff0c;速看深度剖析Kafka Controller选举过程 在查找关于Kafka单机分区的上限以及分区多了会有怎样的问题的时候&#xff0c;发现了这个比较有趣的问题&#xff0c;就记录了下来。 一般所有的分布式系统&#xff0c;都会涉及…

linux——Bash特性

bash是一个命令解释器&#xff0c;其支持命令行展开&#xff5b;&#xff5d;写法 alias是命令别称&#xff0c;即为命令等同于&#xff0c;使用unalias对应命令可以取消该别称 alias可以对命令进行更改

Apache Doris 2.1.2 版本正式发布!

亲爱的社区小伙伴们&#xff0c;Apache Doris 2.1.2 版本已于 2024 年 4 月 12 日正式发布。该版本提交了若干改进项以及问题修复&#xff0c;进一步提升了系统的性能及稳定性&#xff0c;欢迎大家下载体验。 官网下载页&#xff1a;https://doris.apache.org/download/ GitH…

牛客周赛 Round 40(补题)C题

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小红拿到了一个长度为nnn的数组aaa&#xff0c;她希望你构造两个排列ppp和qqq&#xff0c;满足对于i∈[1,n],aii∈[1,n],a_ii∈[1,n],ai​为pip_ipi​或qiq_iqi​二选一。你能帮帮她…

【大语言模型】轻松本地部署Stable Diffusion

硬件要求&#xff1a; 配备至少8GB VRAM的GPU&#xff0c;如果你的电脑只有CPU&#xff0c;请看到最后。根据部署规模&#xff0c;需要足够的CPU和RAM。 软件要求&#xff1a; Python 3.7或更高版本。支持NVIDIA GPU的PyTorch。Hugging Face的Diffusers库。Hugging Face的Tr…

错题记录-华为海思

华为 海思数字芯片 参考 &#xff1a;FPGA开发/数字IC笔试系列(5) 华为海思IC笔试解析 FPGA开发/数字IC笔试系列(6) 华为海思IC笔试解析 SystemVerilog Function与Task的区别 $readmemh与$readmemb这两个系统任务是用来从指定文件中读取数据到寄存器数组或者RAM、ROM中。除了…

终端的颜值担当-WindTerm

一、序言 今天就不给各位大佬聊技术了&#xff0c;给大佬们分享一款高颜值的终端工具——WindTerm。 二、什么是 WindTerm WindTerm&#xff08;也称为 Wind Term&#xff09;是一款终端仿真器&#xff0c;可用于在 Windows/MacOS/Linux 操作系统上模拟类 Unix 环境的命令行…

MariaDB 10.5,MySQL乱码问题,设置字符编码UTF8

目录 场景介绍 具体的解决方法 idea设置编码 修改navicate中创建数据库的编码格式 修改MariaDB 10.5&#xff0c;MySQL的my.ini文件 MariaDB 10.5 MySQL找到路径点开&#xff0c;打开my.ini文件 场景介绍 在网页修改&#xff0c;或者提交数据时候&#xff0c;中文将会变…

大语言模型隐私防泄漏:差分隐私、参数高效化

大语言模型隐私防泄漏&#xff1a;差分隐私、参数高效化 写在最前面题目6&#xff1a;大语言模型隐私防泄漏Differentially Private Fine-tuning of Language Models其他初步和之前的基线微调模型1微调模型2通过低秩自适应进行微调&#xff08; 实例化元框架1&#xff09; 在隐…

AttributeError: module ‘backend_interagg‘ has no attribute ‘FigureCanvas‘.

问题1&#xff1a; AttributeError: module backend_interagg has no attribute FigureCanvas. 解决方案&#xff1a; import matplotlib matplotlib.use(Agg) # 选择合适的后端&#xff0c;如Aggimport matplotlib.pyplot as plt在你的代码开头加上这两行代码&#xff0c;…

C++类和对象(五)——友元、内部类、匿名对象

1. 友元 友元提供了一种突破封装的方式&#xff0c;有时提供了便利。但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以 友元不宜多用。 友元分为&#xff1a;友元函数和友元类 &#xff08;1&#xff09;友元函数 问题&#xff1a;现在尝试去重载operator<&l…

linux实用C++库之日志

目录 1 介绍2 内容 1 介绍 本博客用来记录linux下日志库的基本使用。 2 内容 安装&#xff1a; 使用&#xff1a; CMakeLists.txt编写&#xff1a;

Claude 3 Opus 效果是否真的可以超过GPT-4?

实测,不仅是超过,而且我个人感觉这个差距甚至大于GPT3.5到GPT4的距离. claude3在长篇理学论文的解析能力是非常显著的,可以扩展补完作者省略的大量运用高等数学,复变函数以及更多数理方法的计算过程,并且将中间过程补完的非常完美.不会漏符号,错符号,偏差数值之类的问题.工科许…

CTFHUB-技能树-Web前置技能-文件上传(无验证,JS前端验证,前端验证)

CTFHUB-技能树-Web前置技能-文件上传&#xff08;无验证&#xff0c;JS前端验证&#xff0c;前端验证—.htaccess&#xff09; 文章目录 CTFHUB-技能树-Web前置技能-文件上传&#xff08;无验证&#xff0c;JS前端验证&#xff0c;前端验证—.htaccess&#xff09;文件上传无验…

xilinx cpri ip 开发记录

CPRI是无线通信里的一个标准协议&#xff0c;连接REC和RE的通信。 Xilinx有提供CPRI IP核。 区别于其它通信协议&#xff0c;如以太网等&#xff0c;CPRI是一个同步系统。 这就意味着两端的Master和Slave应当是同源时钟的&#xff0c;两边不存在频差&#xff0c;并且内部延时…

套接字基础

套接字基础 套接字一、socket二、setsockopt三、bind四、listen五、select六、poll七、epoll一、水平模式&#xff08;Level-Triggered&#xff0c;LT&#xff09;二、边沿模式&#xff08;Edge-Triggered&#xff0c;ET&#xff09; 套接字 最近学习网络编程的时候&#xff0c…