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

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.mzph.cn/web/658.shtml

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

相关文章

【MIT6.824】lab3 Fault-tolerant Key/Value Service 实现笔记

引言 lab3A的实验要求如下&#xff1a; Your first task is to implement a solution that works when there are no dropped messages, and no failed servers. You’ll need to add RPC-sending code to the Clerk Put/Append/Get methods in client.go, and implement Pu…

算法课程笔记——pair的使用

先思考&#xff0c;为什么 STL 中的容器和算法都是用的左闭右开区间&#xff1f; | | | 这样迭代器只需要支持和!(或者<或者)操作就可以方便的进行区间遍历了。 其它区间设置的话&#xff0c;要么得支持<操作&#xff0c;要么得在循环体内&#xff0c;操作之前进行!判定。…

牛客2024 【牛客赛文X】春招冲刺 ONT34 加油站【中等 贪心 C++、Java、Go、PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/a013a0691a0343aeb262ca1450d2fe4e 思路 贪心&#xff1a; 如果总的gas小于走完全程的cost&#xff0c;直接返回-1不需要再找了 如果确保了可以走完一圈之后&#xff0c;那么从index 0开始找&#xff0c; 当g…

java-生产者消费者

目录 1.生产者消费者1.1生产者和消费者模式概述【应用】1.2生产者和消费者案例【应用】1.3生产者和消费者案例优化【应用】1.4阻塞队列基本使用【理解】1.5阻塞队列实现等待唤醒机制【理解】 1.生产者消费者 1.1生产者和消费者模式概述【应用】 概述 生产者消费者模式是一个十…

Linux软件包管理器yum—1

目录 一、Linux下软件安装的方式 二、yum 2.1查看yum已配置的源&#xff1a; 2.2查看yum配置文件&#xff1a; 2.3使用root用户安装软件&#xff1a; 2.4模糊搜索 2.5安装软件&#xff1a; 2.6卸载软件&#xff1a; 2.7扩展源&#xff1a; 2.8yum源更新&#xff1a; 一…

实验室三大常用仪器2---函数信号发生器的基本使用方法(笔记)

目录 函数信号发生器的基本使用方法 如何连接函数信号发生器和示波器 实验室三大常用仪器1---示波器的基本使用方法&#xff08;笔记&#xff09;-CSDN博客 实验室三大常用仪器3---交流毫伏表的使用方法&#xff08;笔记&#xff09;-CSDN博客 示波器是用来显示和测量信号的…

05-Logistic Softmax详解

Logistic Regression 本章我们来看另一个简单且强大的解决线性回归二元分类问题的算法&#xff0c; 即逻辑回归。不要望文生义&#xff0c; 逻辑回归虽然带回归这个字眼&#xff0c; 但它其实处理的是分类任务&#xff0c;即逻辑回归是一种分类模型&#xff0c; 而非回归模型&…

西夏区第三届中华诗词大会活动方案

活动流程/比赛规则 1.【13:30-14:10】 参赛选手签到&#xff1b;领取参赛号码牌&#xff1b;分组抽签&#xff1b;拍摄赛前感言&#xff0c;集体祝福口号&#xff1b; 2.【14:10-14:25】 熟悉设备、答题环节、题目设置等&#xff0c;走台演练 3.【14:25-14:30】 播放暖场视频…

怎么配置python

右键点击“计算机”&#xff0c;选择“属性”。 在左侧栏找到“高级系统设置”。 点击“环境变量”。 在系统变量中&#xff0c;双击“Path”。 在字符串的末尾&#xff0c;加一个分号; 然后再输入你安装python的路径&#xff0c;如图所示&#xff1a; 点击“确定”&#xff0…

logisim 图解超前进位加法器原理解释

鄙人是视频作者&#xff0c;文件在视频简介的网盘链接。 找规律图解超前进位加法器与原理解释_哔哩哔哩_bilibili 一句话就是“把能导致进位到这个位置的情况全都穷举一遍。” 穷举情况看图中算式。 视频讲解比较啰嗦。

C++修炼之路之继承<一>隐藏,赋值转换规则,继承关系

目录 前言 一&#xff1a;继承的概念和定义 1.概念 2.继承的定义 1.定义格式 2.继承关系和访问限定符 3.继承基类成员访问方式的变化 二&#xff1a;基类和派生类对象赋值转换 规则 三&#xff1a;继承中的作用域 规则 经典举例 经典例题--区分函数重载和隐藏…

PyQt介绍——QStackedWidget堆栈组件的介绍使用

QStackedWidget是一个堆栈窗口控件&#xff0c;用于管理多个堆叠的子部件。它只显示当前选中的子部件&#xff0c;而隐藏其余的子部件。 例子&#xff1a; ControlWidget窗口中&#xff0c;创建QStackedWidget&#xff0c;分别添加两个组件&#xff0c;为Test1Widget和Test2W…

商务品牌解决方案企业网站模板 Bootstrap5

目录 一.前言 二.展示 三.下载链接 一.前言 这个网站包含以下内容&#xff1a; 导航栏&#xff1a;主页&#xff08;Home&#xff09;、关于&#xff08;About&#xff09;、服务&#xff08;Services&#xff09;、博客&#xff08;Blog&#xff09;等页面链接。主页部分…

thinkphp 框架封装curl请求

tp6 或者 tp8框架 在框架的app/common.php 文件里加一些方法就可以 app\common.php 在这个文件里加 以下代码 就可以实现基于 curl的请求方法 (记得要开启 php的curl扩展) 查看方法 cmd里输入 php -m if (!function_exists(get)) {/*** 发送get请求* param string $url 请求…

excel表格怎么设置密码?excel文件加密的两个方法

一、加密码的原理​ Excel加密码的原理主要基于加密算法和密钥管理。当用户为Excel文件或工作表设置密码时&#xff0c;Excel会采用一种加密算法对文件或工作表进行加密处理。这种加密算法通常是对称加密算法&#xff0c;如AES(高级加密标准)或DES(数据加密标准)。 二&#x…

数据结构—单链表

1、链表的概念及结构 1.1链表的概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;但在逻辑上确是连续、顺序的&#xff0c;而数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 1.2链表的结构 如下图&#xff1a; 逻辑上的链表&#xff0c;pList是指…

中断的设备树修改及上机实验(按键驱动)流程

写在前面的话&#xff1a;对于 GPIO 按键&#xff0c;我们并不需要去写驱动程序&#xff0c;使用内核自带的驱动程序 drivers/input/keyboard/gpio_keys.c 就可以&#xff0c;然后你需要做的只是修改设备树指定引脚及键值。 根据驱动文件中的platform_driver中的.of_match_tabl…

gemini国内能用吗

gemini国内能用吗 虽然 Gemini 的具体功能和性能还未完全公开&#xff0c;但基于 Google 在 AI 领域的强大背景和技术实力&#xff0c;已经火出圈了&#xff0c;很多小伙伴已经迫不及待想了解一下它有什么优势以及如何快速使用上 首先我们来讲一下gemini的优势 多模态能力&a…

Springboot配置文件(application.yml)的加载顺序

spring boot 启动会扫描一下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 file…/config/ file…/ classpath:/config classpath:/ 以上是按照优先级从高到低的顺序&#xff0c;所有位置的文件都会被加载&#xff0c;高优先级配置内容会…

C++-命名空间

C 命名空间是一种用于组织代码的机制&#xff0c;可以帮助避免命名冲突&#xff0c;提高代码的可读性和可维护性。命名空间将代码分组到逻辑单元中&#xff0c;允许在不同的代码单元中使用相同的名称而不会产生冲突。 命名空间通过将代码放置在一个命名空间内部来实现。在 C 中…