当前位置: 首页 > news >正文

Java中的Collection

Collection

Collection 集合概述和使用

  • Collection集合概述

    • 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素

    • JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现

  • 创建Collection集合的对象

    • 多态的方式

    • 具体的实现类ArrayList

  • Collection集合常用方法

    方法名说明
    boolean add(E e)添加元素
    boolean remove(Object o)从集合中移除指定的元素
    boolean removeIf(Object o)根据条件进行移除
    void clear()清空集合中的元素
    boolean contains(Object o)判断集合中是否存在指定的元素
    boolean isEmpty()判断集合是否为空
    int size()集合的长度,也就是集合中元素的个数

collection集合体系图

各类使用场景

collection三种通用的遍历方式

1. 迭代器(不依赖索引)

介绍
  • 迭代器,集合的专用遍历方式

  • Iterator<E> iterator(): 返回此集合中元素的迭代器,通过集合对象的iterator()方法得到

三个主要的方法:
  • boolean hasNext(): 检查是否还有下一个元素。

  • Object next(): 返回下一个元素。

  • void remove(): 删除迭代器最后一次返回的元素。

使用迭代器遍历集合的基本步骤如下:
  1. 获取集合的迭代器对象。

  2. 使用hasNext()方法检查是否还有下一个元素。

  3. 使用next()方法获取下一个元素。

  4. 重复步骤2和3,直到没有更多元素。

下面是一个使用迭代器遍历ArrayList的简单示例:
 
import java.util.ArrayList;import java.util.Iterator;​public class IteratorExample {public static void main(String[] args) {// 创建一个ArrayList对象ArrayList<String> list = new ArrayList<>();list.add("元素1");list.add("元素2");list.add("元素3");​// 获取迭代器Iterator<String> iterator = list.iterator();​// 使用迭代器遍历ArrayListwhile (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}​// 尝试删除元素(可选)if (iterator.hasNext()) {iterator.next();iterator.remove(); // 删除最后一个访问的元素}​// 再次遍历ArrayList,观察删除效果System.out.println("删除元素后:");iterator = list.iterator();while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}}}
注意事项:
  • 迭代器遍历完毕,指针不会复位。

  • 循环中只能用一次next方法,因为用两次next方法可能回导致指针越界。

  • next和hasnext方法要配套使用。

  • 迭代器遍历时,不能用集合调用remove方式进行删除,要调用iterator中的方式进行删除。

增强for循环

介绍
  • 它是JDK5之后出现的,其内部原理是一个Iterator迭代器

  • 实现Iterable接口的类才可以使用迭代器和增强for

  • 简化数组和Collection集合的遍历

基本语法如下:
 for (元素类型 元素变量 : 集合或数组) {    // 循环体}

例如,遍历一个ArrayList:

 aList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Cherry");for (String fruit : list) {System.out.println(fruit);}
注意事项
  1. 增强for循环只能用于遍历,不能用于添加或删除元素。在循环体内对集合进行修改(如add或remove)可能会引发ConcurrentModificationException异常。

  2. 对于基本数据类型,如int、double等,需要在前面声明一个对应的包装类型变量,如Integer、Double等。

Lambda表达式

Lambda表达式是Java 8引入的一种新特性,主要用于表示匿名函数。在遍历集合时,常与Stream API结合使用。基本语法如下:

 集合.stream().forEach(元素 -> {    // 对元素进行操作});

例如,遍历一个ArrayList并打印每个元素:

public class A07_CollectionDemo7 {public static void main(String[] args) {/* lambda表达式遍历:default void forEach(Consumer<? super T> action):*/​//1.创建集合并添加元素Collection<String> coll = new ArrayList<>();coll.add("zhangsan");coll.add("lisi");coll.add("wangwu");//2.利用匿名内部类的形式//底层原理://其实也会自己遍历集合,依次得到每一个元素//把得到的每一个元素,传递给下面的accept方法//s依次表示集合中的每一个数据/* coll.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});*/​//lambda表达式coll.forEach(s -> System.out.println(s));}}
注意事项
  1. Lambda表达式主要用于函数式编程,适用于对集合进行复杂操作,如过滤、映射、排序等。对于简单的遍历操作,增强for循环可能更加直观和高效。

  2. Lambda表达式在遍历过程中同样不能修改集合,否则会引发异常。

  3. Lambda表达式中的->操作符左侧是参数列表,右侧是Lambda体。如果Lambda体只有一条语句,可以省略大括号和分号。

  4. Lambda表达式可以引用外部变量,但这些变量必须是final或等效于final的(即未被修改过)。

相关文章:

  • 扩频通信信号的产生与接收
  • MySQL 常用优化方式
  • 学习:吴恩达:什么是神经元?神经网络如何工作?
  • idea生成WebServices接口
  • HTML超链接去下划线
  • vue3 + vite 项目可以使用纯Js开发吗?
  • Image Fusion via Vision-Language Model【文献阅读】
  • React Switch用法及手写Switch实现
  • 初学者如何学习python
  • leetcode 热题 100_三数之和
  • LeetCode——二叉树(Java)
  • 【Vue3】PostCss 适配
  • GO基本类型一些记录
  • Spring八股 常见面试题
  • 爆红提醒:ESLint: Parsing error: Unexpected token. Did you mean `{‘>‘}` or `gt;`?
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Akka系列(七):Actor持久化之Akka persistence
  • Android 架构优化~MVP 架构改造
  • happypack两次报错的问题
  • JavaScript DOM 10 - 滚动
  • JavaScript中的对象个人分享
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • node和express搭建代理服务器(源码)
  • Python 基础起步 (十) 什么叫函数?
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Shell编程
  • socket.io+express实现聊天室的思考(三)
  • 不上全站https的网站你们就等着被恶心死吧
  • 动态魔术使用DBMS_SQL
  • 复习Javascript专题(四):js中的深浅拷贝
  • 聊聊directory traversal attack
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 通过几道题目学习二叉搜索树
  • 为什么要用IPython/Jupyter?
  • MPAndroidChart 教程:Y轴 YAxis
  • ​用户画像从0到100的构建思路
  • #微信小程序:微信小程序常见的配置传旨
  • (145)光线追踪距离场柔和阴影
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (三分钟)速览传统边缘检测算子
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (译)2019年前端性能优化清单 — 下篇
  • .NET 8.0 发布到 IIS
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .net分布式压力测试工具(Beetle.DT)
  • // an array of int
  • @Valid和@NotNull字段校验使用
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • []FET-430SIM508 研究日志 11.3.31
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)