Java集合概述(Collection集合)
目录
- 集合
- 一、集合与数组
- 二、集合类体系结构
- 三、泛型(约定集合存储数据类型)
- 四、Collection集合常用API
- 五、Collection集合的遍历方式
- 5.1 迭代器遍历
- 5.2 增强for循环(for each):
- 5.3 lambda表达式
- 六、Collection集合存储自定义类型的对象
- 七、常见数据结构
集合
一、集合与数组
数组的特点:数组定义完成并启动后,类型确定、长度固定。
因此,在进行增删操作的时候,数组是不太合适的,可能需要放弃原有数组或者移位
弊端:
- 不适合元素的个数和类型不确定的业务场景
- 不适合做需要增删数据操作
- 数组的功能也比较的单一,处理数据的能力并不是很强大
因此,引入了集合。
集合是java中存储对象数据的一种容器
集合的特点:集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
优势:
- 集合非常适合元素个数不能确定,且需要做元素的增删操作的场景。
- 同时,集合提供的种类特别的丰富,功能也是非常强大的,开发中集合用的更多。
总结:
- 数组和集合的元素存储的个数问题。
- 数组定义后类型确定,长度固定
- 集合类型可以不固定,大小是可变的。
- 数组和集合存储元素的类型问题。
- 数组可以存储基本类型和引用类型的数据。
- 集合只能存储引用数据类型的数据。
- 数组和集合适合的场景
- 数组适合做数据个数和类型确定的场景。
- 集合适合做数据个数不确定,且要做增删元素的场景,集合种类更多,功能更强大。
二、集合类体系结构
集合:
- Collection单列集合,每个元素(数据)只包含一个值。
- Map双列集合,每个元素包含两个值(键值对)。
Collection集合特点
- List系列集合:添加的元素是有序、可重复、有索引。
- ArrayList、LinekdList :有序、可重复、有索引。
- Set系列集合:添加的元素是无序、不重复、无索引。
- HashSet: 无序、不重复、无索引
- LinkedHashSet: 有序、不重复、无索引。
- TreeSet:按照大小默认升序排序、不重复、无索引。
public class CollectionDemo1 {public static void main(String[] args) {//有序 可重复 有索引Collection list=new ArrayList<>();list.add("Java");list.add("Java");list.add("Mybatis");list.add(12);list.add(12);list.add(false);list.add(false);System.out.println(list);//[Java, Java, Mybatis, 12, 12, false, false]//无序 不重复 无索引Collection list1=new HashSet();list1.add("Java");list1.add("Java");list1.add("Mybatis");list1.add(12);list1.add(12);list1.add(false);list1.add(false);System.out.println(list1);//[Java, false, 12, Mybatis]}
}
三、泛型(约定集合存储数据类型)
集合都是泛型的形式,可以在编译阶段约束集合只能操作某种数据类型
Collection<String> lists = new ArrayList<String>();
Collection<String> lists = new ArrayList<>(); // JDK 7开始后面的泛型类型申明可以省略不写
注意:集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。
//Collection<int> lists = new ArrayList<>(); 错误写法
如果集合中要存储基本类型的数据怎么办?
// 存储基本类型使用包装类
Collection<Integer> lists1 = new ArrayList<>();
Collection<Double> lists2 = new ArrayList<>();
四、Collection集合常用API
Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
五、Collection集合的遍历方式
方式一:迭代器
方式二:foreach/增强for循环
方式三:lambda表达式
5.1 迭代器遍历
迭代器遍历概述
- 遍历就是一个一个的把容器中的元素访问一遍。
- 迭代器在Java中的代表是Iterator,迭代器是集合的专用的遍历方式
public static void main(String[] args) {Collection<String> list=new ArrayList<>();list.add("String1");list.add("String2");list.add("String3");list.add("String4");System.out.println(list);//[String1, String2, String3, String4]//1.得到当前集合的迭代器对象Iterator<String> i= list.iterator();//2.定义while循环while (i.hasNext()){String element=i.next();System.out.println(element);}}
- Collection集合获取迭代器
- Iterator iterator():返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引
- Iterator中的常用方法
- boolean hasNext():询问当前位置是否有元素存在,存在返回true ,不存在返回false
- E next():获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界
迭代器如果取元素越界会出现什么问题
会出现NoSuchElementException异常
5.2 增强for循环(for each):
既可以遍历集合也可以遍历数组。
它是JDK5之后出现的,其内部原理是一个lterator迭代器,遍历集合相当于是迭代器的简化写法。
实现Iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了lterable接口。
格式:
for(元素数据类型 变量名 : 数组或者Collection集合) {//在此处使用变量即可,该变量就是元素
}
例子
public static void main(String[] args) {Collection<String> list=new ArrayList<>();list.add("String1");list.add("String2");list.add("String3");list.add("String4");System.out.println(list);//[String1, String2, String3, String4]//foreach 进行遍历for (String element:list) {System.out.println(element);} }
5.3 lambda表达式
Collection结合Lambda遍历的API:
default void forEach(Consumer<? super T> action): 结合lambda遍历集合
public static void main(String[] args) {Collection<String> list=new ArrayList<>();list.add("String1");list.add("String2");list.add("String3");list.add("String4");System.out.println(list);//[String1, String2, String3, String4]//forEach 内部类list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});//ForEach lambda表达式list.forEach((String s)->{System.out.println(s);});//ForEach lambda表达式简化list.forEach(s->System.out.println(s));}
ForEach方法的底层代码:通过增强for实现
default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}
六、Collection集合存储自定义类型的对象
案列需求:某影院系统需要在后台存储上述三部电影,然后依次展示出来
分析
- 定义一个电影类
public class Movie {private String name;private double score;private String actor;public Movie(String name, double score, String actor) {this.name = name;this.score = score;this.actor = actor;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}public String getActor() {return actor;}public void setActor(String actor) {this.actor = actor;}
}
- 定义一个集合存储电影对象。
- 创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
- 遍历集合中的3个对象,输出相关信息。
public class TestDemo {public static void main(String[] args) {//定义一个集合存储电影对象。Collection<Movie> movies=new ArrayList<>();//创建3个电影对象,封装相关数据,把3个对象存入到集合中去。movies.add(new Movie("《肖生克的救赎》", 9.7 , "罗宾斯"));movies.add(new Movie("《霸王别姬》", 9.6 , "张国荣、张丰毅"));movies.add(new Movie("《阿甘正传》", 9.5 , "汤姆.汉克斯"));//遍历集合中的3个对象,输出相关信息。for (Movie m:movies) {System.out.println("片名"+m.getName());System.out.println("评分"+m.getScore());System.out.println("导演"+m.getActor());}}
}
集合中存储的是元素的什么信息?
集合中存储的是元素对象的地址。
七、常见数据结构
- 队列:先进先出,后进后出。
- 栈:后进先出,先进后出。
- 数组:内存连续区域,查询快,增删慢。
- 链表:元素是游离的,查询慢,首尾操作极快。
- 二叉树:永远只有一个根节点, 每个结点不超过2个子节点的树。
- 查找二叉树:小的左边,大的右边,但是可能树很高,查询性能变差。
- 平衡查找二叉树:让树的高度差不大于1,增删改查都提高了。
- 红黑树(就是基于红黑规则实现了自平衡的排序二叉树)
相关文章:

Java集合概述(Collection集合)
目录集合一、集合与数组二、集合类体系结构三、泛型(约定集合存储数据类型)四、Collection集合常用API五、Collection集合的遍历方式5.1 迭代器遍历5.2 增强for循环(for each):5.3 lambda表达式六、Collection集合存储自定义类型的对象七、常见数据结构集合 一、集合与数组 数…...

运动无线蓝牙耳机哪款好、运动无线蓝牙耳机推荐
作为 运动爱好者,每天早晨醒来后的第一件事就去家门口的湿地公园跑上一圈。各种运动装备都齐了,不过在耳机选择上还真的犯难,打着“运动耳机”旗号的产品也是种类繁多,那么到底什么样的无线耳机更适合运动呢?于是我花时…...

解决AAC音频编码时间戳的计算问题
1.主题音频是流式数据,并不像视频一样有P帧和B帧的概念。就像砌墙一样,咔咔往上摞就行了。一般来说,AAC编码中生成文件这一步,如果使用的是OutputStream流写入文件的话,就完全不需要计算时间。但在音视频同步或者使用A…...
Android 9.0 添加自定义开机广播
1.概述 在9.0的系统rom定制化开发中,由于系统开机广播接收受限,普通app接收不到这个广播,如果接收这个广播很多应用 感觉要好久收到这个广播, 所以需要自定义开机广播来使用自定义广播开启某些应用,实现自己的功能,接下来就需要分析下开机广播的流程,然后增加自定义广播…...
第四阶段10-添加类别,类别列表mapper层,service层,controller层
63. 添加类别–Mapper层 插入类别数据的功能此前已经完成! 64. 添加类别–Service层 在项目的根包下创建pojo.dto.CategoryAddNewDTO类: Data public class CategoryAddNewDTO implements Serializable {/*** 类别名称*/private String name;/*** 父…...
linux内核启动分析(一)
文章目录1.HEAD1.preserve_boot_args1.1 __inval_dcache_area2.el2_setup3. set_cpu_boot_mode_flag4. __create_page_tables4.1map_memory5. __cpu_setup6. __primary_switch6.1 __enable_mmu6.2 __primary_switched最近工作中经常使用飞腾E2000的开发版,也遇到一些…...

wireshark常见使用操作讲解以及几个故障解决案例分享
(1)网卡选择 对于电脑本身有多个网卡的时候,选择网卡就成为了一个困惑的地方,其实这里很简单,只要把鼠标放在对应的网卡上面就可以看到地址等信息,就容易判断出来了。 (2)过滤器 直…...

利用逻辑分析仪解析串口通讯数据
利用逻辑分析仪解析串口通讯数据🔧采用的是市面上最为广泛使用的USB逻辑分析仪: 📚资料下载: 链接: https://pan.baidu.com/s/1c9lwWDbtJxaJED-kzSbiJg 提取码: 5vnr🔨测试工具为:Logic 2.4.6,也可以使用Pu…...
新整理的前端面试题
pinia和vuex的区别(1)pinia它没有mutation,他只有state,getters,action【同步、异步】使用他来修改state数据(2)pinia他默认也是存入内存中,如果需要使用本地存储,在配置上比vuex麻烦…...

数据仓库-数仓分层
层级 全拼 职责划分 ODS(源数据层) Operational DataStore ODS层存储最原始的数据, 对数据不做任何加工处理; 源数据主要来自业务数据库和日志,这些数据是用户操作业务系统产生,所以叫操作型数据(Operational Data) 。 DWD(…...

【Linux】Linux根文件系统扩容
场景:根文件系统需要至少100GB的剩余空间,但是目前就剩余91GB。因此,我们需要对根文件系统进行扩容。# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 3.9G 0 3.9G 0% /dev tmpfs …...

RPC编程:Hessian RPC一个老的RPC框架(一)
RPC编程:Hessian RPC一个老的RPC框架一:Hessian RPC1:Hession RPC一个老的RPC框架2:老,为什么还要研究?3:Hession RPC概念二:Hessian RPC设计思想1:Hession依赖于服务器2…...

逆向 x蜂窝 zzzghostsigh
逆向 x蜂窝 zzzghostsigh 版本 9.3.7 新版本是64位的so charles 抓包 目标字段 zzzghostsigh frida java function hook_xPreAuthencode() {Java.perform(function() {var helper Java.use("com.mfw.tnative.AuthorizeHelper");helper.xPreAuthencode.implemen…...

QML 鼠标事件
作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 QML 中有一些元素本身是不具备交互能力的(例如:Rectangle、Text、Image 等),那么如何通过鼠标来控制它们的行为呢?这里就需要用到 MouseArea 元素了,它继承于 Item 且不可见,通常需要与可见元素结合使…...

极智项目 | 实战pytorch arcface人脸识别
欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文介绍 实战pytorch arcface人脸识别,并提供完整项目源码。 本文介绍的实战arcface人脸识别项目,提供完整的可以一键训练、测试的项目工程…...

【IP技术】ipv4和ipv6是什么?
IPv4和IPv6是两种互联网协议,用于在互联网上标识和寻址设备。IPv4(Internet Protocol version 4)是互联网协议的第四个版本,是当前广泛使用的互联网协议。IPv4地址由32位二进制数构成,通常表示为4个十进制数࿰…...

linux基本功系列之uniq命令实战
文章目录前言一. uniq的命令介绍二. 语法格式及常用选项三. 参考案例3.1 统计行数3.2 对文本进行去重3.3 显示不重复的行3.4 仅显示重复的行,且显示重复的行的所有行3.5 忽略字母大小写总结前言 大家好,又见面了,我是沐风晓月,本…...

六、SpringBoot项目搭建
日志 Java 主流日志工具库 统一接口 什么是 REST? Representational State Transfer——“表现层状态转化”。可以总结为一句话:REST 是所有 Web 应用都应该遵守的架构设计指导原则。面向资源是 REST 最明显的特征,对于同一个资源的一组不…...

【LeetCode】2363. 合并相似的物品
2363. 合并相似的物品 题目描述 给你两个二维整数数组 items1 和 items2 ,表示两个物品集合。每个数组 items 有以下特质: items[i] [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ,weighti 表示第 i 件物品的 重量 。items 中每…...

华为OD机试题,用 Java 解【出租车计费】问题
最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...