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

news2025/1/19 14:17:59

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集合的对象

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

代码示例:

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

Collection集合常用方法

添加元素:
  • boolean add(E e): 将指定元素添加到集合中,如果集合因添加而发生改变则返回 true,否则返回 false。
// 创建一个 ArrayList 实例,ArrayList 是 Collection 接口的实现类
Collection<String> list = new ArrayList<>();

// 添加元素
boolean res = list.add("Banana"); // 结果: true
  • boolean addAll(Collection<? extends E> c): 将指定集合中的所有元素添加到当前集合中,如果集合因添加而发生改变则返回 true,否则返回 false。
// 创建第一个 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。
// 创建第一个 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。
// 创建一个 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): 判断集合中是否包含指定的元素。
// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));

// 检查集合是否包含某个元素
System.out.println("集合中是否包含 'Banana'? " + list.contains("Banana"));
  • boolean containsAll(Collection<?> c): 判断当前集合是否包含指定集合中的所有元素。
// 创建一个 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(): 判断集合是否为空。
// 创建一个 ArrayList
Collection<String> list = new ArrayList<>();
// 判断集合是否为空
boolean res = list.isEmpty();
System.out.println("集合是否为空? " + res);// 结果为:true
  • int size(): 返回集合中元素的个数。
// 创建一个 ArrayList
Collection<String> list = new ArrayList<>(Arrays.asList("Apple", "Banana", "Cherry", "Date", "Elderberry"));

// 获取集合的长度
int size = list.size();
System.out.println("集合的长度为: " + size);
其它操作:
  • Object[] toArray(): 返回一个包含集合中所有元素的数组。
// 创建一个 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:参数是一个对象数组,其元素类型与集合中的元素类型相同。如果传入的数组足够大(即长度大于等于集合的大小),那么集合的元素将被复制到这个数组中,并返回这个数组。如果传入的数组太小,系统会创建一个新的数组,大小正好足以容纳集合中的所有元素,并返回这个新数组。
// 创建一个 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(): 清除集合中的所有元素。
 // 创建一个 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()方法实现:
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()之间调用

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

// 创建一个 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引入的简洁遍历集合的方式,语法简洁易读,不需要显式调用迭代器。

// 创建一个 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()方法进行遍历并处理每个元素。

// 创建一个 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接口的实现类不具备索引访问能力。

// 创建一个 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.coloradmin.cn/o/1608151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[数据结构]——二叉树——堆排序

后续代码以此为基础 typedef int HPDataTyp; typedef struct Heap {HPDataTyp * a; int size; int capacity; } Hp; 1.首先我们需要掌握两种堆算法 1&#xff0c;堆向下调整算法 现在我们给出一个数组&#xff0c;逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整…

【学习笔记】论文创新点

论文创新点 论文创新点的突破口 论文的烦恼 选择方向&#xff0c;热门方向&#xff08;但不是最新的&#xff09;。 经典的、持续时间长的&#xff0c;学习资源多。 应用型创新 适应在交叉学科 数量少 一般需要改进算法 怎么改进是一个很大的问题 因此寻找创新点十分重要 …

elmentui树形表格使用Sortable拖拽展开行时拖拽bug

1、使用elemntui的el-table使用Sortable进行拖拽&#xff0c;如下 const el this.$el.querySelector(.el-table__body-wrapper tbody) Sortable.create(el, {onEnd: (event) > {const { oldIndex, newIndex } event//拿到更新前后的下标即可完成数据的更新} })2、但是我这…

【Entity Framework】闲话EF中批量配置

【Entity Framework】闲话EF中批量配置 文章目录 【Entity Framework】闲话EF中批量配置一、概述二、OnModelCreating中的批量配置元数据API的缺点 三、预先约定配置忽略类型默认类型映射预先约定配置的限制约定添加新约定替换现有约定约定实现注意事项 四、何时使用每种方法进…

vivado 存储器校准调试

存储器校准调试 Vivado 中的存储器接口 IP 支持校准调试。其中存储有实用的核配置、校准和数据窗口信息 &#xff0c; 可在 Vivado 硬件管理器 中访问这些信息。“存储器校准调试 (Memory Calibration Debug) ”可随时用于读取此信息 &#xff0c; 并从存储器接口 IP 中获…

TongRds docker 镜像做成与迁移(by liuhui)

TongRds docker 镜像做成与迁移 一&#xff0c;使用 docker commit 命令制作 TongRds docker 镜 像 1.1 拉取基础镜像 centos 并运行该镜像 拉取镜像&#xff1a;docker pull ubuntu 镜像列表&#xff1a;docker images 运行镜像&#xff1a;docker run -itd --name myubuntu…

做外贸企业邮箱哪个好?外贸邮箱价格怎么样?

随着全球化的深入&#xff0c;外贸公司在国际市场上的竞争日益猛烈。公司邮箱是公司和外界沟通的重要桥梁&#xff0c;其挑选与使用对外贸公司至关重要。目前市面上&#xff0c;Zoho Mail公司邮箱&#xff0c;Gmail、Outlook、阿里云公司邮箱和腾讯企业邮箱等各有特色&#xff…

欢乐钓鱼大师加速、暴击内置脚本,直接安装

无需手机root,安装软件即可使用&#xff0c;仅限安卓。 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

【技巧】PPT文件如何添加公司LOGO?

在工作上&#xff0c;我们经常要给PPT文件添加上公司的logo&#xff0c;如果一页一页添加不但耗时耗力&#xff0c;还容易有遗漏。那怎样快速给PPT添加logo呢&#xff1f;不清楚的小伙伴一起来看看如何吧&#xff01; 操作步骤&#xff1a; 1.打开PPT文件&#xff0c;点击菜单…

资产收集利器-ARL灯塔

介绍 ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统&#xff0c;旨在快速侦察与目标关联的互联网资产&#xff0c;构建基础资产信息库。 它拥有收集管理资产、资产监控、扫描与管理指纹、Github 关键字监控、文件泄漏等风险检测、nuclei PoC 调用等功能。 搭建 灯塔…

Vitis AI 迁移学习并部署在DPU中

目录 1. 本文目的 2. ResNet18介绍 3. 迁移学习 4. 量化配置文件 5. 模型编译&#xff1a; 6. 总结 1. 本文目的 使用迁移学习的方法&#xff0c;将预训练的resnet18模型从原来的1000类分类任务&#xff0c;改造为适应自定义的30类分类任务。 2. ResNet18介绍 ResNet1…

零基础小白如何自学网络安全(入门)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

VMware17Pro虚拟机安装macOS教程(超详细)

目录 1. 前言2. 下载所需文件3. 安装VMware3.1 安装3.2 启动并查看版本信息3.3 虚拟机默认位置配置 4. 安装补丁4.1 解压补丁4.2 结束VMware相关进程4.3 运行补丁包 5. 安装macOS5.1 新建虚拟机5.2 修改虚拟机配置5.3 安装操作系统5.3.1 选择 ISO 映像文件5.3.2 开启虚拟机5.2.…

CommunityToolkit.Mvvm笔记---AsyncRelayCommand

AsyncRelayCommand 是 CommunityToolkit.Mvvm 中的一个功能&#xff0c;专门设计用来处理异步操作。它是 RelayCommand 的一个变体&#xff0c;提供了对异步任务的支持&#xff0c;允许开发者在 MVVM&#xff08;Model-View-ViewModel&#xff09;模式中方便地实现异步命令。使…

前端打包webpack vite

起步 | webpack 中文文档 | webpack中文文档 | webpack中文网 npm run build 1webpack: mkdir webpack-demo cd webpack-demo npm init -y npm install webpack webpack-cli --save-dev vite : 快速上手 | Vue.js

Android Room 记录一个Update语句不生效的问题解决记录

代码展示 1.数据实体类 Entity public class User {PrimaryKey(autoGenerate true)private long id;private String name;private String age;private String sex;public User(String name, String age, String sex) {this.name name;this.age age;this.sex sex;}public …

CSS基础:table的4个标签的样式详解(6000字长文!附案例)

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

llama_factory微调QWen1.5

GitHub - hiyouga/LLaMA-Factory: Unify Efficient Fine-Tuning of 100 LLMsUnify Efficient Fine-Tuning of 100 LLMs. Contribute to hiyouga/LLaMA-Factory development by creating an account on GitHub.https://github.com/hiyouga/LLaMA-FactoryQwen1.5 介绍 | QwenGITH…

EEG基础

01 简介 脑电图(EEG)因其低成本、无创、便携以及毫秒级的高时间分辨率等特点&#xff0c;成为了研究大脑功能、异常和神经生理动力学的可靠且广泛使用的测量工具。 在神经信号处理领域&#xff0c;EEG通常作为一种非侵入性的脑成像技术用于诊断脑部疾病&#xff0c;而正常EE…

50.基于SpringBoot + Vue实现的前后端分离-酒店管理系统(项目 + 论文PPT)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的酒店管理系统设计与实现管理工作系统…