Java中的集合框架
概念与作用
集合概念
现实生活中:很多事物凑在一起
数学中的集合:具有共同属性的事物的总体
java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象
在编程时,常常需要集中存放多个数据,当然我们可以使用数组来保存多个对象。但数组长度不可变化,一旦初始化数组时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数组就有点无能为力了;而且数组无法保存具有映射关系的数据,如成绩表:语文-79,数学-80,这种数据看上去像两个数组,但这个两个数组元素之间有一定的关联关系。
为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),java提供集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有集合类都位于java.util包下。
集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(实际上也是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。
集合的作用
集合与数组对比
集合框架的体系结构
Java的集合类主要由两个接口派生而出:Collection和Map,
Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
图7.1是Collection接口、子接口及其实现类的继承树。
图7.1中的粗线圈出的Set和List接口是Collection接口派生出的两个子接口,它们分别代表了无序集合和有序集合,阴影部分HashSet和ArrayList是两个主要的实现类。
图7.2是Map体系的继承数,所有的Map实现类用于保存具有映射关系的数据(也就是前面介绍的关系数组)
图7.2中显示了Map接口的众多实现类,这些实现类在功能、用法上存在一定的差异,但它们都有一个功能特征:Map保存的每项数据都是Key-value对,也就是有key和value两个值组成。就像前面介绍的成绩单:语文-79,数学-80,每项成绩都由2个值组成。Map里的key是不可重复的,key用于标识集合里每项数据,如果需要查阅Map中数据时,总是根据Map的key来获取。
根据图7.1和图7.2中粗线标识的3个接口,我们可以把java的所有集合分成三大类:其中Set集合类似于一个罐子,把一个对象添加到Set集合时,Set集合无法记住这个元素的顺序,所以Set里的元素不能重复(否则系统无法准确识别这个元素);List集合非常像一个数组,它可以记住每次添加元素的顺序,只是List的长度是可变的。Map集合也像一个罐子,只是它里面的每项数据都由两个值组成。
如果访问List集合中的元素,可以直接根据元素的索引来访问;如果需要访问Map集合中的元素,可以根据每项元素的key来访问其value;如果希望访问Set集合中的元素,则只能根据元素本身来访问(这也是Set集合里元素不允许重复的原因)。
对于List、Set和Map三种集合,最常用的实现类在图7.1、7.2中以灰色区域覆盖,分别是HashSet、ArrayList和HashMap三个实现类。
Collection接口和List接口简介
List接口是一个有序集合,其元素以线性方法存储,集合中允许存放重复的元素。
List接口及其实现类——ArrayList
ArrayList 类是数组列表类,实现了可变长度的数组,允许对集合中的元素进行快速的访问,但向ArrayList 集合中插入或删除速度较慢。。(需要移动元素)
ArrayList 集合允许所有的元素,包括null。
每一个ArrayList 实例都有一个默认的容量,即存储元素的个数,这个容量可以随着元素的增加而自动变大。
链表类:LinkedList类
LinkedList 是链表类,采用链表结构保存元素。链表结构的优点是便于向集合中插入和删除元素。
因为在插入或删除元素时,不需要移动任何元素。
List的增删改查的方法
实现功能
创建Course类
真正工程中应将所有的属性私有化,通过get和set方法去访问属性
创建学生类
学生能选课,就有很多课程信息,把他的课程信息存放在set类型的属性courses里
因为Set是一个接口,所以不能直接实例化,通过HashSet这个实现类来进行实例化。
创建一个备选课程类ListTest类
创建List类型的属性courseToselect(用于存放备选课程的List)
添加ListTest构造方法,并初始化courseToselect属性,因为List是一个接口,所以在构造方法中不能直接实例化,而通过它的实现类ArrayList来实例化。
对象存入集合当中的时候都会变成Object类型,取出时需要进行类型转换
如果添加到List中的长度大于他目前的长度,则系统会出现异常,即数组下表越界异常。
List是接口,所以在构造方法中不能直接实例化,而通过ArrayList实例化。
用ArrayList的addall方法时,需要将添加的数据转换为列表类型,用asList方法。Arrays.asList(a) 将a由数据类型转变为列表类型list。
用List的add(Object e)和add(int index,Object e)可以向List中添加单个元素,用addall(Collextion c)和addall(int index,Collextion c)可以添加集合(多个元素)。若在index位置有元素,则此元素及后面的元素向下移动。
用List的add(Object e)和add(int index,Object e)可以想List中添加单个元素,用addall(Collextion c)和addall(int index,Collextion c)可以添加集合(多个元素),
通过get()方法,可以把List中相应的索引位置上的元素给取出来。那么如果想要取得List中每一个元素的值,需要用一个for循环像遍历数组一样遍历List。
创建一个testGet方法,为依次遍历List中的元素,首先我们需要取得List的长度,通过调用List的Size()方法来实现。
1.用for循环配合get()方法遍历集合
-
迭代器:获取集合迭代器lt--while(lt.hasNext())循环遍历集合--将lt.Next()强转成集合元素类型并用其接收。注意:迭代器只遍历不存储,必须依赖集合存在。
Iterator本身也是一个接口,Iterator接口。有一个hasNext方法(参数布尔类型)
foreach循环遍历:for(object obj:集合名)
修改List中的元素
List中有个set方法
set(int index, E element)方法,修改列表中的元素
参数:index - 要替换的元素的索引,element - 要在指定位置存储的元素
返回:以前在指定位置的元素
删除List中的元素
remove(Object e)
remove(int index)
removeAll()
泛型
创建一个TestGeneric类(测试泛型)
添加一个带有泛型的List类型的属性。在构造器中初始化courses属性
测试循环遍历,用for(Course cr: courses)
是把元素作为Course类型取出来,而不是作为Object类型取出来
泛型集合不仅可以存入泛型类型的对象实例,还可以添加泛型的子类型的对象实例
新建一个继承Course类的ChildCourse类。Course类如果只有含参构造器的话,编译器就不会自动添加隐式的无参构造器。子类中必须调用父类的隐式构造器ChildCourse类就会报错。需要手动的在父类中加一个无参构造器。
在TestGeneric类中添加一个testChild方法
泛型集合可以添加泛型的子类型的对象实例
泛型集合中,不能添加泛型规定的类型及其子类型以外的对象,否则会报错。
泛型应该注意的地方:
1.泛型集合中的限定类型不能使用基本数据类型。必须是引用数据类型。
2.如果非要使用基本数据类型时,必须使用它们的包装类 如:int->Integer
Set
Set接口及其实现类--HashSet
list有序的,Set无序的 ,所以Set没有set()这个给定指定索引位置去修改元素的方法。
案例功能
创建一个SetTest类
将Student类中Set类型的属性修改一下,添加一个Course类型的泛型。
在SetTest类添加一个带有泛型Course的List类型的属性courseToSelect,创建SetTest的构造器,初始化courseToSelect属性
因为课程的ID是一个字符串,是一个对象,用equals方法跟输入的字符串比较是否相等。
set特点:无序,不可重复
无序:循环遍历set时只能用foreach或者迭代器iterator方法,不能用get()方法,因为set是无序的,没有index。遍历输出也是乱序的。
不可重复:如果添加几个相同的元素,则只会保留一个!
散列级:HashSet 类
HashSet类是按照哈希算法来存取集合中的元素的,使用哈希算法可以提高存取的效率。当向HashSet 集合中添加元素时,就会调用该元素的hashCode() 方法,获取哈希码值,然后根据这个哈希码值计算出该元素的存放位置。
HashSet 集合具有以下特点:
- 不能保证元素的排列顺序,集合中元素的顺序随时有可能发生改变。
- 集合中最多允许存在一个null元素
- HashSet 集合不是线程同步的。
Map和HashMap简介
Collection存储的都是单个元素。而Map提供了一种映射的关系(key到value的映射)。
因此,Map集合中保存这两组值,一组用于保存key,另一组用于保存value,key和value都可以是任何引用数据类型。Map集合中的key不允许重复,每一个key只能映射一个value。
Map接口
通过put()方法添加一个键值对的映射
put
V put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值(当且仅当 m.containsKey(k) 返回 true 时,才能说映射 m 包含键 k 的映射关系)。
参数:
key - 与指定值关联的键
value - 与指定键关联的值
返回:
以前与 key 关联的值,如果没有针对 key 的映射关系,则返回 null。(如果该实现支持 null 值,则返回 null 也可能表示此映射以前将 null 与 key 关联)。
Map接口提供三种方法:1.
Set<K> | keySet() 返回此映射中包含的键的 Set 视图。 |
2.
Collection<V> | values() 返回此映射中包含的值的 Collection 视图。 |
3.
Set<Map.Entry<K,V>> | entrySet() 返回此映射中包含的映射关系的 Set 视图。 |
HashMap类
案例功能
集合工具类:Collections
Collections 类是用于操作List、Set和Map等集合的工具类,该类提供了大量的方法可以对集合元素进行排序、查询和修改等操作。
Collections 类是java.util包下的。它所提供的方法均为静态方法,可以直接通过“类名.方法”的形式调用。小结
- 集合的长度是可变的,但是只能存放引用数据类型的数据,不能存放基本数据类型的数据;
- Collection 是集合类的基本接口,其主要的子接口有List 和 Set。而Map 不是其子接口。Collection 接口声明所有集合类的核心方法,一般情况下都不会使用Collection 接口,而是使用其子类List和Set集合。
- List 是有序的Collection,使用List 接口可以精确地控制每个元素插入的位置,也可以通过索引来访问List集合中的元素。List接口常用的实现类有ArrayList 和LinkedList。List 集合允许存放重复的元素。
- Set 是一个不包含重复元素的Collection,Set允许包含null元素,但不能包含重复的元素。一般重写类的equals() 和 hashCode() 方法来区别Set集合中元素是否相同。
- Set 接口常用的子类有HashSet 和TreeSet,其中HashSet 是按照哈希算法来存取集合中的元素的,其存取的效率高。HashSet 类是无序存放元素的,而TreeSet 是有序存放元素的,但是需要使用Comparable 进行排序操作。
- 集合的输出有多种方式,其中使用Iterator 迭代器是标准的输出方式,在JDK1.5 之后集合也支持了foreach 方式。
- Map 没有继承Collection 接口,可以用于保存具有映射关系的数据,其提供的是key 到value的映射。
- Map接口常用实现类有HashMap 和TreeMap。HashMap 类是基于哈希表的Map接口的实现,对于元素的添加和删除有着较高的效率。TreeMap 集合主要是对所有的key进行排序,从而保证所有的key-value 映射关系处于有序状态。TreeMap 集合在元素的添加、删除和定位映射性能较低。
相关文章:
Java中的集合框架
概念与作用 集合概念 现实生活中:很多事物凑在一起 数学中的集合:具有共同属性的事物的总体 java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象 在编程时,常常需要集中存放多个…...
Rustdesk打开Win10 下客户端下面服务不会自启,显示服务未运行
环境: Rustdesk1.19 问题描述: Rustdesk打开Win10 下客户端下面服务不会自启,显示服务未运行 解决方案: 1.查看源代码 pub async fn start_all() {crate::hbbs_http::sync::start();let mut nat_tested = false;check_zombie()...
【SPDK】【NoF】使用SPDK部署NVMe over TCP
SPDK NVMe over Fabrics Target是一个用户空间应用程序,通过以太网,Infiniband或光纤通道等结构呈现块设备,SPDK目前支持RDMA和TCP传输。 本文将在已经编译好SPDK的基础上演示如何使用SPDK搭建NVMe over TCP,前提是您已经将一块NVMe硬盘挂载…...
Spring boot 3 集成rocketmq-spring-boot-starter解决版本不一致问题
安装RocketMQ根据上篇文章使用Docker安装RocketMQ并启动之后,有个隐患详情见下文 Spring Boot集成 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2…...
python爬虫实战(6)--获取某度热榜
1. 项目描述 需要用到的类库 pip install requests pip install beautifulsoup4 pip install pandas pip install openpyxl然后,我们来编写python脚本,并引入需要的库: import requests from bs4 import BeautifulSoup import pandas as p…...
十三、K8S之亲和性
亲和性 一、概念 在K8S中,亲和性(Affinity)用来定义Pod与节点关系的概念,亲和性通过指定标签选择器和拓扑域约束来决定 Pod 应该调度到哪些节点上。与污点相反,它主要是尽量往某节点靠。 亲和性是 Kubernetes 中非常…...
对于网关的理解-Gateway
因为在使用微服务的时候,会有多端请求。会产生以下问题: 1.客户端需要记住每一个微服务的url 2.主机端口也会直接暴露 3.每一个微服务都需要认证 4.存在跨域问题 所以网关可以解决统一访问、隐藏真实的服务器地址、网关进行统一认证、解决跨域问题、…...
win10 - Snipaste截图工具的使用
win10 - Snipaste截图工具的使用 Step 1:下载 下载链接 提取码:wuv2 Step 2:直接解压可用 找到解压好的目录,并双击exe文件即可 Step 3:设置开机启动 在电脑右下角找到snipaste图标,右键,找…...
Selenium 学习(0.19)——软件测试之基本路径测试法——拓展案例
1、案例 请使用基本路径法为变量year设计测试用例,year的取值范围是1000<year<2001。代码如下: 2、步骤 先画控制流程图 再转化为控制流图(标出节点) V(G) 总区域数 4 V(G) E - N 2 (边数 - 节点数 2…...
工作记录-------正则表达式---小白也能看懂
什么是正则表达式 正则表达式是一种强大的工具,用于匹配和识别文本模式。 下面是一个基本的介绍: ^ 和 $: 这些是锚定字符,分别匹配字符串的开头和结尾。例如,^Hello匹配以 “Hello” 开头的字符串,end$匹配以 “en…...
C3-1.3.1 无监督学习——异常检测
C3-1.3.1 无监督学习——异常检测 1、举例:异常值检测示例——密度评估法 1.1 举一个例子 这里做的是 查看飞机发动机 异常检测: 左侧:X1 ,X2 … 是 可能会影响发动机状态的特征右侧: Dataset:训练数据集New engine…...
1.4.1机器学习——梯度下降+α学习率大小判定
1.4.1梯度下降 4.1、梯度下降的概念 ※【总结一句话】:系统通过自动的调节参数w和b的值,得到最小的损失函数值J。 如下:是梯度下降的概念图。 我们有一个损失函数 J(w,b),包含两个参数w和b(你可以想象成J(w,b) w*x…...
在IntelliJ IDEA中,.idea文件是什么,可以删除吗
相信有很多小伙伴,在用idea写java代码的时候,创建工程总是会出现.idea文件,该文件也从来没去打开使用过,那么它在我们项目里面,扮演什么角色,到底能不能删除它呢? 1、它是什么?有什么…...
【Spring Cloud】Gateway组件的三种使用方式
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Spring Cloud》。🎯🎯 &am…...
对象的复制
方式一:sv 的new函数 trans tr1,tr2; malbox.get(tr2); tr1 new tr2;//仅用于浅拷贝,拷贝后tr1,tr2为两个独立的对象方式二:uvm 域的自动化常用函数:copy / clone / 使用前提: 1. 函数都可用于uvm_object类型&…...
基于 Python+Neo4j+医药数据,构建了一个知识图谱的自动问答系统
知识图谱是目前自然语言处理的一个热门方向。目前知识图谱在各个领域全面开花,如教育、医疗、司法、金融等。 本项目立足医药领域,以垂直型医药网站为数据来源,以疾病为核心,构建起一个包含7类规模为4.4万的知识实体,…...
Maven之属性管理
1.属性管理 1.1 属性配置与使用 ①:定义属性 <!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version> </properties>②:引用属性 <dependency><groupId>org.springframewor…...
快乐学Python,数据分析之获取数据方法「公开数据或爬虫」
学习Python数据分析,第一步是先获取数据,为什么说数据获取是数据分析的第一步呢,显而易见:数据分析,得先有数据,才能分析。 作为个人来说,如何获取用于分析的数据集呢? 1、获取现成…...
前端常用的设计模式
设计模式:是一种抽象的编程思想,并不局限于某一特定的编程语言,而是在许多语言之间是相通的;它是软件设计中常见的问题的通用、可反复使用、多少人知晓的一种解决方案或者模板。一般对与从事过面向对象编程的人来说会更熟悉一些。…...
游戏引擎支持脚本编程有啥好处
很多游戏引擎都支持脚本编程。Unity、Unreal Engine、CryEngine等大型游戏引擎都支持使用脚本编写游戏逻辑和功能。脚本编程通常使用C#、Lua或Python等编程语言,并且可以与游戏引擎的API进行交互来控制游戏对象、设置变量、执行行为等。使用脚本编程,游戏…...
react中概念性总结(二)
目录 说说你对react的理解?有哪些特性? 说说Real diff算法是怎么运作的,从tree层到component层到element层分别讲解? 调和阶段setState干了什么? 说说redux的工作流程? 为什么react元素有一个$$type属…...
WPF自定义漂亮顶部工具栏 WPF自定义精致最大化关闭工具栏 wpf导航栏自定义 WPF快速开发工具栏
在WPF应用程序开发中,自定义一个漂亮的顶部工具栏具有多重关键作用,它不仅增强了用户体验,还提升了整体应用的专业性和易用性。以下是对这一功能的详细介绍: 首先,自定义顶部工具栏是用户界面设计的重要组成部分&…...
Transformer 的双向编码器表示 (BERT)
一、说明 本文介绍语言句法中,最可能的单词填空在self-attention的表现形式,以及内部原理的介绍。 二、关于本文概述 在我之前的博客中,我们研究了关于生成式预训练 Transformer 的完整概述,关于生成式预训练 Transformer (GPT) 的…...
关于LwRB环形缓冲区开源库的纯C++版本支持原子操作
1、LwRB环形缓冲区开源库: GitHub - MaJerle/lwrb: Lightweight generic ring buffer manager libraryLightweight generic ring buffer manager library. Contribute to MaJerle/lwrb development by creating an account on GitHub.https://github.com/MaJerle/l…...
微信小程序Canvas画布绘制图片、文字、矩形、(椭)圆、直线
获取CanvasRenderingContext2D 对象 .js onReady() {const query = wx.createSelectorQuery()query.select(#myCanvas).fields({ node: true, size: true }).exec((res) => {const canvas = res[0].nodeconst ctx = canvas.getContext(2d)canvas.width = res[0].width * d…...
Unity Editor实用功能:Hierarchy面板的对象上绘制按按钮并响应
目录 需求描述上代码打个赏吧 需求描述 现在有这样一个需求: 在Hierarchy面板的对象上绘制按钮点击按钮,弹出菜单再点击菜单项目响应自定义操作在这里的响应主要是复制对象层级路路径 看具体效果请看动图: 注: 核心是对Edito…...
解决录制的 mp4 视频文件在 windows 无法播放的问题
解决录制的 mp4 视频文件在 windows 无法播放的问题 kazam 默认录制保存下来的 mp4 视频文件在 windows 中是无法直接使用的,这是由于视频编码方式的问题。解决办法: 首先安装 ffmeg 编码工具: sudo apt-get install ffmpeg 然后改变视频的…...
一键与图片对话!LLM实现图片关键信息提取与交互
本期文心开发者说邀请到飞桨开发者技术专家徐嘉祁,主要介绍了如何通过小模型与大模型的结合,解决数据分析中的问题。 项目背景 在智能涌现的大模型时代,越来越多的企业和研究机构开始探索如何利用大模型来提升工作效率,助力业务智…...
洛谷 P8833 [传智杯 #3 决赛] 课程 讲解
前言: 大家好! 我们又见面啦~~~ 对于我20多天没上号,深表歉意!! 希望大家给我的account点一个赞,加一个粉丝,谢谢! 也对CSDN的所有博主们送上衷心的祝福! 如有错误…...
中国IT产经新闻:新能源汽车发展前景与燃油车的利弊之争
随着科技的进步和环保意识的提高,新能源汽车在全球范围内逐渐受到重视。然而,在新能源汽车迅速发展的同时,燃油车仍然占据着主导地位。本文将从新能源与燃油车的利弊、新能源汽车的发展前景两个方面进行分析,以期为读者提供全面的…...
wordpress json 时间/上海关键词排名软件
JavaScript零碎知识点基本概念数据类型操作符变量引用类型对象Object数组ArrayFunction类型基本包装类型BOM浏览器对象模型DOM文档对象模型事件基本概念 js组成 ECMAScriptDOM文档对象模型BOM浏览器对象模型 ECMAScript与JavaScript关系 ECMAScript 是 JavaScript 的规范&…...
网站建设昆明螺蛳湾/热点新闻事件素材
我试图从时间相关的旋转矩阵RE(t)(即纬度48.3的地球自转)计算velocity tensor.这是通过确定偏斜对称矩阵SE(t) dRE(t)/ dt * RE.T来实现的.使用float而不是Sympy表达式时,我得到的结果不正确,如下例所示:from IPython.display import displayimport sympy as sysy.i…...
视频添加到wordpress/自己想开个网站怎么弄
讲师简介晁岳攀(鸟窝)百度,资深工程师 多次GopherChina大会讲师,极客时间专栏作者,Go微服务框架 rpcx 作者。演讲内容演讲主题:《Go泛型的实现、陷阱和应用场景》主题摘要:Go泛型2022年2月份就要…...
网站设计网站建设专业/百度app下载官方免费下载安装
目录 单点登录简介SSO&CAS是什么单点登录适合什么场景单点登录的三种实现方式CAS的几个重要知识点CAS的实现过程单点登录简介 单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获…...
爱情网站设计/电商平台怎么注册
FPGA Editor,相信和Xilinx FPGA打过交道的人大都听说过,但用过的人就不是很多。我可以负责任的说,你一旦用过FPGA Editor,就会爱不释手,不能自已。 我毛华望QQ849886241。技术博客http://blog.csdn.net/my_share 好像…...
涟水做网站/杭州seo公司排名
踏上勤奋的阶梯,方可达到智慧的高峰。只有勤奋加上智慧,才有可能实现成功的理想。一月再见,二月你好!认定了的路,再痛也不要皱一下眉头,你要知道,再怎么难走都是你自己选择的,你没有…...