JAVA学习日记(十四)集合进阶
一、单列集合Collection


List系列集合特点:添加的元素是有序(存和取的顺序一致)、可重复、有索引
Set系列集合特点:添加的元素是无序(存和取的顺序有可能不一致)、不重复、无索引
Collection是所有单列集合的祖宗接口,其功能所有的单列集合都能继承使用。

import java.util.ArrayList;
import java.util.Collection;public class Main {public static void main(String[] args){//利用多态创建对象//对于成员变量:在子类的对象中,会把父类的成员变量继承下去。多态创建的对象是采用父类变量。//对于成员方法:如果子类对方法进行了重写,那么在继承时,虚方法表中会覆盖父类的方法,因此多态创建的对象采用子类方法。Collection<String> collection=new ArrayList<>();//1、添加元素//对于同为Collection子类的 List系列集合 和 Set系列集合 两者都继承了父类种的 add 方法//如果是通过List系列集合的对象调用 add 方法,则方法永远返回true(添加成功),因为List系列集合允许元素重复//如果是通过Set系列集合的对象调用 add 方法,则方法会在元素不重复的情况下返回true(添加成功),否则返回false,因为Set系列集合不允许元素重复collection.add("abc");collection.add("def");collection.add("ghi");System.out.println(collection); //[abc, def, ghi]//2、清空// collection.clear();// System.out.println(collection); //[]//3、删除//因为Set系列集合具有 无序 的特点,因此在父类中定义的remove方法是共性的方法——既无法通过索引删除,只能通过元素的对象删除。//方法返回的是boolean类型的值,删除成功(要删除的元素存在)则返回true,反之返回false。System.out.println(collection.remove("abc")); //trueSystem.out.println(collection); //[def, ghi]//4、判断元素是否包含//contains方法底层是依赖equals方法进行判断是否存在的//如果集合中存储的是自定义对象,也想通过contains方法判断是否包含,在Javabean中一定要重写Equals方法//因为对于引用数据类型,equals方法比较的是元素的地址值boolean result1=collection.contains("def");boolean result2=collection.contains("defg");System.out.println(result1); //trueSystem.out.println(result2); //false//5、判断集合是否为空boolean result3=collection.isEmpty();System.out.println(result3); //false//6、判断集合长度System.out.println(collection.size()); //2collection.add("abc");System.out.println(collection.size()); //3}}
二、Collection遍历方式
(一)迭代器遍历
特点:不依赖索引
迭代器在Java中的类是Iterator,迭代器是集合专用的遍历方式。

注意点:
①代器遍历结束后,指针不会复位,若需要再次遍历,只能再创建一个新的迭代器对象
②循环中只能用一次next方法(可以用一个变量进行记录)
③迭代器遍历时,不能用集合的方法进行增加或者删除(若要进行删除操作,需要用迭代器对象调用remove方法,增加目前没有办法)
④如果当前位置没有元素,还要强行获取,会报错,报错类型位:NoSuchElementException
import java.util.ArrayList;
import java.util.Iterator;public class Main {public static void main(String[] args){ArrayList<String> list=new ArrayList<>();list.add("三");list.add("连");list.add("外");list.add("加");list.add("转");list.add("发");list.add("了");list.add("吗");list.add("?");list.add("?");Iterator<String> it=list.iterator(); //返回迭代器对象,默认指向集合的0索引boolean flag=it.hasNext();System.out.println(flag);String str=it.next();//获取当前元素,并将迭代器对象移向下一个位置System.out.println(str);// 三str=it.next();System.out.println(str);// 连}
}
import java.util.ArrayList;
import java.util.Iterator;public class Main {public static void main(String[] args){ArrayList<String> list=new ArrayList<>();list.add("三");list.add("连");list.add("外");list.add("加");list.add("转");list.add("发");list.add("了");list.add("吗");list.add("?");list.add("?");Iterator<String> it=list.iterator(); //返回迭代器对象,默认指向集合的0索引boolean flag=it.hasNext();System.out.println(flag);//使用迭代器进行遍历while(it.hasNext()){String str=it.next();System.out.print(str+" ");//三 连 外 加 转 发 了 吗 ? ? }}
}
(二)增强for遍历
①增强for的底层就是迭代器,为了简化迭代器的代码书写的。
②是JDK5之后出现的,内部原理就是一个Iterator迭代器。
③所有的单列集合和数组才能用增强for进行遍历。
格式:

例:
import java.util.ArrayList;
import java.util.Collection;public class Main {public static void main(String[] args){//集合的三种遍历方式:迭代器遍历 增强for循环遍历 lambda表达式遍历Collection<String> list=new ArrayList<>();list.add("三");list.add("连");list.add("外");list.add("加");list.add("转");list.add("发");list.add("了");list.add("吗");list.add("?");list.add("?");//增强for循环遍历//快速生成方式: list.for (集合名字.for)for(String s:list){System.out.print(s+" ");}}
}
注意点:
修改增强for中的变量,不会改变集合中原本的数据(遍历过程中是用第三方变量记录集合中的元素,修改增强for中的变量不影响集合元素)
(三)Lambda表达式遍历
例:
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;public class Main {public static void main(String[] args){//集合的三种遍历方式:迭代器遍历 增强for循环遍历 lambda表达式遍历Collection<String> list=new ArrayList<>();list.add("三");list.add("连");list.add("外");list.add("加");list.add("转");list.add("发");list.add("了");list.add("吗");list.add("?");list.add("?");//增强for循环遍历for(String s:list){System.out.print(s+" ");}System.out.println();System.out.println("________________________");//使用匿名内部类的形式遍历list.forEach(new Consumer<String>() {@Override//s依次表示集合中的每一个数据//方法底层也是遍历集合,依次得到每一个元素,把得到的每一个元素,传递给下面的accept方法//s依次表示集合中的每一个数据public void accept(String s) {System.out.print(s+" ");}});System.out.println();System.out.println("___________________________");//使用Lambda表达式简化匿名内部类方法list.forEach(s-> System.out.print(s+" "));}
}
(四)总结

三、List系列集合
特点:有序、有索引、可重复
List集合方法:
①Collection的方法都继承了
②List集合有索引,有很多关于索引操作的方法:

关于remove方法的问题:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;public class Main {public static void main(String[] args){//List系列集合List<Integer> list1=new ArrayList<>();list1.add(1);list1.add(2);list1.add(3);//若想要删除元素1//list1.remove(1); 会判断1为集合的索引而不是元素//正确方法list1.remove((Integer) 1);System.out.println(list1); //[2, 3]}
}
原因:remove方法在调用时,发生了重载现象,默认优先调用实参和形参类型一致的方法。
方法示例代码:
import java.util.ArrayList;
import java.util.List;public class Main {public static void main(String[] args){//List系列集合//因为List类是一个接口类,所以不能直接创建接口类的对象//在这边只能创建一个List的实现类的对象List<String> list=new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");System.out.println(list); //[aaa, bbb, ccc, ddd]// add(int index,E element) 在指定索引出插入指定的元素list.add(0,"fff");System.out.println(list); //[fff, aaa, bbb, ccc, ddd]System.out.println("__________________");//E remove(int index) 删除指定索引处的元素,返回被删除的元素String remove=list.remove(2);System.out.println(remove); //bbbSystem.out.println(list); //[fff, aaa, ccc, ddd]// E set(int index,E element) 修改指定索引处的元素,将被修改处的原元素返回System.out.println("_____________________");String set=list.set(0,"hahaha");System.out.println(set); //fffSystem.out.println(list); //[hahaha, aaa, ccc, ddd]System.out.println("_________________");//E get(int index) 返回指定索引处的元素String get=list.get(0);System.out.println(get); //hahaha}
}
List集合遍历方式:

示例代码:
import java.util.*;public class Main {public static void main(String[] args){//List系列集合遍历方法List<String> list=new ArrayList<>();list.add("aaa");list.add("bbb");list.add("ccc");list.add("ddd");System.out.println(list); //[aaa, bbb, ccc, ddd]System.out.println("__________________________");//1、迭代器遍历//创建迭代器对象Iterator<String> it=list.iterator();System.out.print("迭代器遍历: ");while(it.hasNext()){String str=it.next();System.out.print(str+" ");}System.out.println();System.out.println("________________");//2、增强for遍历System.out.print("增强for遍历:");for (String s : list) {System.out.print(s+" ");}System.out.println();System.out.println("______________________");//3、Lambda表达式遍历System.out.print("Lambda表达式遍历:");list.forEach(s-> System.out.print(s+" "));System.out.println();System.out.println("___________________");//4、普通for循环遍历System.out.print("普通for循环遍历:");for(int i=0;i<list.size();i++){System.out.print(list.get(i)+" ");}System.out.println();System.out.println("_________________________");//5、列表迭代器遍历//创建列表迭代器对象//比迭代器多了一个功能: 能够在遍历的同时添加元素(之前只能用迭代器的remove方法删除元素)ListIterator<String> lit=list.listIterator();System.out.print("列表迭代器遍历: ");while(lit.hasNext()){String str=lit.next();if("ddd".equals(str)){lit.add("qqq");}System.out.print(str+" "); //aaa bbb ccc ddd }System.out.println();System.out.println(list); //[aaa, bbb, ccc, ddd, qqq]}
}
五种方法对比:

相关文章:
JAVA学习日记(十四)集合进阶
一、单列集合Collection List系列集合特点:添加的元素是有序(存和取的顺序一致)、可重复、有索引 Set系列集合特点:添加的元素是无序(存和取的顺序有可能不一致)、不重复、无索引 Collection是所有单列集合…...
mysql全量与增量备份
binlog日志: 从上一次全量备份到下一次全量备份直接产生的数据。 一、全备和增量备份介绍 1、全量备份: 备份所有数据库或只备份一个数据库,全量备份之后,全量备份之前的binlog日志就没用了,一般生产环境会保留3-7天…...
“非法”操控lambda(python)
能过python解释器关卡即是合法脚本代码,偶尔的“违规”操控也是一种唯美。 (笔记模板由python脚本于2024年11月13日 11:18:21创建,本篇笔记适合熟悉python的lambda操控的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.pyth…...
UDP协议和TCP协议之间有什么具体区别?
UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)是两种常见的网络传输协议,它们在数据传输中有着显著的区别和适用场景。理解它们的区别对于网络工程师、软件开发人员以及网络安全专家都是至关重要的…...
论文5—《基于改进YOLOv5s的轻量化金银花识别方法》文献阅读分析报告
论文报告:基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档 基于改进YOLOv5s的轻量化金银花识别方法 论文报告文档摘要国内外研究现状国内研究现状国外研究现状 研究目的研究问题使用的研究方法试验研究结果文献结论创新点和对现有研究的贡献1. 目标检测技术2. …...
快手直播间采集教程,快手引流,快手截流,截流工具,直播间截流,快手直播间采集,获客系统,获客软件
功能: 1.输入快手直播间链接可一键监控直播间 2.可采集新进直播间的人 3.可采集直播间所有动作,包含:发弹幕的人和内容、送礼物的人和送的礼物、点亮爱心的人 4.可一键导出新进直播间的快手ID 5.可一键导出直播间动作列表,也可以筛…...
探索MoviePy:Python视频编辑的瑞士军刀
文章目录 🎬 探索MoviePy:Python视频编辑的瑞士军刀第一部分:背景介绍第二部分:MoviePy是什么?第三部分:如何安装MoviePy?第四部分:MoviePy的基本函数使用方法1. 视频剪辑2. 视频拼接…...
mysql 实现分库分表之 --- 基于 MyCAT 的分片策略详解
引言 在我们日常工作的项目中,特别是面向 C 端用户的产品,随着业务量的逐步扩大,数据量也呈指数级增长。为了应对日益增长的数据库压力,数据库优化已成为项目中不可或缺的一环,而分库分表则是海量数据优化方案中的重要…...
Opencascade基础教程(14): 一个模型显示问题
如果显示模型时出现如图情况,正对屏幕的平面特别亮,只需要设置材质为非金属就行。 //创建box并显示TopoDS_Shape aShape BRepPrimAPI_MakeBox(100, 100, 100);Handle(AIS_Shape) aisShpae new AIS_Shape(aShape);aisShpae->SetDisplayMode(AIS_Shad…...
ISP——你可以从这里起步(二)
接上一篇,上一篇是原理篇,这一篇是实战篇,为了实现下面框图中的不完美ISP。 第一章 做一张RAW图自己用 不是所有的人都能获得raw图,即使获得了raw图也需要对应的sensor参数才能把它用起来,所以我找了一条野路子可以把…...
Qt / Qt Quick程序打包的一些坑 (四)
【写在前面】 打包方法见 Qt / Qt Quick程序打包的方法。 这里是再次记录一些坑。 【正文开始】 直接进入正题: 在 Qt5 中,如果我们的 Qml 中使用了【Qt Shapes】模块,那么在打包的时候,会缺少Qt5QuickShapes.dll。 然后ÿ…...
《传统视觉算法在视觉算法中的地位及应用场景
一、引言 在计算机视觉领域的发展历程中,传统视觉算法扮演了至关重要的角色。尽管近年来深度学习算法在视觉任务中取得了巨大的成功,但传统视觉算法依然具有不可替代的地位。传统视觉算法通常基于数学模型和手工设计的特征,具有计算效率高、…...
老老实实干一辈子程序员是没出息的!这本证书你早该学!
一、程序员有没有必要学软考? 当然有,因为你不可能一辈子都是程序员。 你了解或者接触过30岁、35岁以上的程序员去向吗? 我毕业快十年了,当初正赶上互联网时代的浪潮,好几个学计算机的同学毕业后去了一线城市或者深…...
鸿蒙next版开发:相机开发-录像(ArkTS)
在HarmonyOS 5.0中,ArkTS提供了一套完整的API来管理相机功能,特别是录像功能。本文将详细介绍如何在ArkTS中实现录像功能,并提供代码示例进行详细解读。 录像功能开发步骤 1. 导入相关接口 首先,需要导入相机相关的接口&#x…...
闯关leetcode——3206. Alternating Groups I
大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/alternating-groups-i/description/ 内容 There is a circle of red and blue tiles. You are given an array of integers colors. The color of tile i is represented by colors[i]: colors[i…...
多个摄像机画面融合:找到同一个目标在多个画面中的伪三维坐标,找出这几个摄像头间的转换矩阵
搞算法,重要的是解决问题的思想,不要再局限于语言、框架、性能!!! 要解决的问题是:在某一个摄像头画面中,目标会被遮挡或者丢失,但在另外一个摄像机画面中,目标完整&…...
Three.js性能优化和实践建议
Three.js 是一个功能强大的 3D 引擎,当场景足够大的时候,就会出现卡顿的现象,首先要保证电脑的性能够用,然后看看下面方法,帮助你提高应用的运行效率。 1. 使用 stats.js 监视性能 在进行任何优化之前,首…...
C#入门 023 什么是类(Class)
什么是“类” 是一种数据结构 是一种数据类型 代表现实世界中的“种类” 构造器和析构器 析构器 析构器(Destructor)是一种特殊的成员方法,用于在对象被垃圾回收器(Garbage Collector, GC)回收之前执行清理操作。…...
一篇Spring Boot 笔记
一、Spring Boot 简介 Spring Boot 是一个用于创建独立的、基于 Spring 的生产级应用程序的框架。它简化了 Spring 应用的初始搭建和开发过程,通过自动配置等功能,让开发者能够快速地构建应用,减少了大量的样板代码和复杂的配置。 二、核心特…...
一生一芯 预学习阶段 NEMU代码学习(2)
接上回:一生一芯 预学习阶段 NEMU代码学习(1) 上次说到这里 static int cmd_c(char *args) {cpu_exec(-1);return 0; } 当输入c时,会执行:cpu_exec(-1); void cpu_exec(uint64_t n) {g_print_step (n < MAX_IN…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
