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

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()方法遍历集合

  1. 迭代器:获取集合迭代器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包下的。它所提供的方法均为静态方法,可以直接通过“类名.方法”的形式调用。小结

  1. 集合的长度是可变的,但是只能存放引用数据类型的数据,不能存放基本数据类型的数据;
  2. Collection 是集合类的基本接口,其主要的子接口有List 和 Set。而Map 不是其子接口。Collection 接口声明所有集合类的核心方法,一般情况下都不会使用Collection 接口,而是使用其子类List和Set集合。
  3. List 是有序的Collection,使用List 接口可以精确地控制每个元素插入的位置,也可以通过索引来访问List集合中的元素。List接口常用的实现类有ArrayList 和LinkedList。List 集合允许存放重复的元素。
  4. Set 是一个不包含重复元素的Collection,Set允许包含null元素,但不能包含重复的元素。一般重写类的equals() 和 hashCode() 方法来区别Set集合中元素是否相同。
  5. Set 接口常用的子类有HashSet 和TreeSet,其中HashSet 是按照哈希算法来存取集合中的元素的,其存取的效率高。HashSet 类是无序存放元素的,而TreeSet 是有序存放元素的,但是需要使用Comparable 进行排序操作。
  6. 集合的输出有多种方式,其中使用Iterator 迭代器是标准的输出方式,在JDK1.5 之后集合也支持了foreach 方式。
  7. Map 没有继承Collection 接口,可以用于保存具有映射关系的数据,其提供的是key 到value的映射。
  8. Map接口常用实现类有HashMap 和TreeMap。HashMap 类是基于哈希表的Map接口的实现,对于元素的添加和删除有着较高的效率。TreeMap 集合主要是对所有的key进行排序,从而保证所有的key-value 映射关系处于有序状态。TreeMap 集合在元素的添加、删除和定位映射性能较低。

相关文章:

Java中的集合框架

概念与作用 集合概念 现实生活中&#xff1a;很多事物凑在一起 数学中的集合&#xff1a;具有共同属性的事物的总体 java中的集合类&#xff1a;是一种工具类&#xff0c;就像是容器&#xff0c;储存任意数量的具有共同属性的对象 在编程时&#xff0c;常常需要集中存放多个…...

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是一个用户空间应用程序&#xff0c;通过以太网&#xff0c;Infiniband或光纤通道等结构呈现块设备,SPDK目前支持RDMA和TCP传输。 本文将在已经编译好SPDK的基础上演示如何使用SPDK搭建NVMe over TCP&#xff0c;前提是您已经将一块NVMe硬盘挂载…...

Spring boot 3 集成rocketmq-spring-boot-starter解决版本不一致问题

安装RocketMQ根据上篇文章使用Docker安装RocketMQ并启动之后&#xff0c;有个隐患详情见下文 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然后&#xff0c;我们来编写python脚本&#xff0c;并引入需要的库&#xff1a; import requests from bs4 import BeautifulSoup import pandas as p…...

十三、K8S之亲和性

亲和性 一、概念 在K8S中&#xff0c;亲和性&#xff08;Affinity&#xff09;用来定义Pod与节点关系的概念&#xff0c;亲和性通过指定标签选择器和拓扑域约束来决定 Pod 应该调度到哪些节点上。与污点相反&#xff0c;它主要是尽量往某节点靠。 亲和性是 Kubernetes 中非常…...

对于网关的理解-Gateway

因为在使用微服务的时候&#xff0c;会有多端请求。会产生以下问题&#xff1a; 1.客户端需要记住每一个微服务的url 2.主机端口也会直接暴露 3.每一个微服务都需要认证 4.存在跨域问题 所以网关可以解决统一访问、隐藏真实的服务器地址、网关进行统一认证、解决跨域问题、…...

win10 - Snipaste截图工具的使用

win10 - Snipaste截图工具的使用 Step 1&#xff1a;下载 下载链接 提取码&#xff1a;wuv2 Step 2&#xff1a;直接解压可用 找到解压好的目录&#xff0c;并双击exe文件即可 Step 3&#xff1a;设置开机启动 在电脑右下角找到snipaste图标&#xff0c;右键&#xff0c;找…...

Selenium 学习(0.19)——软件测试之基本路径测试法——拓展案例

1、案例 请使用基本路径法为变量year设计测试用例&#xff0c;year的取值范围是1000<year<2001。代码如下&#xff1a; 2、步骤 先画控制流程图 再转化为控制流图&#xff08;标出节点&#xff09; V(G) 总区域数 4 V(G) E - N 2 (边数 - 节点数 2…...

工作记录-------正则表达式---小白也能看懂

什么是正则表达式 正则表达式是一种强大的工具&#xff0c;用于匹配和识别文本模式。 下面是一个基本的介绍&#xff1a; ^ 和 $: 这些是锚定字符&#xff0c;分别匹配字符串的开头和结尾。例如&#xff0c;^Hello匹配以 “Hello” 开头的字符串&#xff0c;end$匹配以 “en…...

C3-1.3.1 无监督学习——异常检测

C3-1.3.1 无监督学习——异常检测 1、举例&#xff1a;异常值检测示例——密度评估法 1.1 举一个例子 这里做的是 查看飞机发动机 异常检测&#xff1a; 左侧&#xff1a;X1 ,X2 … 是 可能会影响发动机状态的特征右侧&#xff1a; Dataset&#xff1a;训练数据集New engine…...

1.4.1机器学习——梯度下降+α学习率大小判定

1.4.1梯度下降 4.1、梯度下降的概念 ※【总结一句话】&#xff1a;系统通过自动的调节参数w和b的值&#xff0c;得到最小的损失函数值J。 如下&#xff1a;是梯度下降的概念图。 我们有一个损失函数 J(w,b)&#xff0c;包含两个参数w和b&#xff08;你可以想象成J(w,b) w*x…...

在IntelliJ IDEA中,.idea文件是什么,可以删除吗

相信有很多小伙伴&#xff0c;在用idea写java代码的时候&#xff0c;创建工程总是会出现.idea文件&#xff0c;该文件也从来没去打开使用过&#xff0c;那么它在我们项目里面&#xff0c;扮演什么角色&#xff0c;到底能不能删除它呢&#xff1f; 1、它是什么&#xff1f;有什么…...

【Spring Cloud】Gateway组件的三种使用方式

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Cloud》。&#x1f3af;&#x1f3af; &am…...

对象的复制

方式一&#xff1a;sv 的new函数 trans tr1,tr2; malbox.get(tr2); tr1 new tr2;//仅用于浅拷贝&#xff0c;拷贝后tr1,tr2为两个独立的对象方式二&#xff1a;uvm 域的自动化常用函数&#xff1a;copy / clone / 使用前提&#xff1a; 1. 函数都可用于uvm_object类型&…...

基于 Python+Neo4j+医药数据,构建了一个知识图谱的自动问答系统

知识图谱是目前自然语言处理的一个热门方向。目前知识图谱在各个领域全面开花&#xff0c;如教育、医疗、司法、金融等。 本项目立足医药领域&#xff0c;以垂直型医药网站为数据来源&#xff0c;以疾病为核心&#xff0c;构建起一个包含7类规模为4.4万的知识实体&#xff0c;…...

Maven之属性管理

1.属性管理 1.1 属性配置与使用 ①&#xff1a;定义属性 <!--定义自定义属性--> <properties><spring.version>5.2.10.RELEASE</spring.version> </properties>②&#xff1a;引用属性 <dependency><groupId>org.springframewor…...

快乐学Python,数据分析之获取数据方法「公开数据或爬虫」

学习Python数据分析&#xff0c;第一步是先获取数据&#xff0c;为什么说数据获取是数据分析的第一步呢&#xff0c;显而易见&#xff1a;数据分析&#xff0c;得先有数据&#xff0c;才能分析。 作为个人来说&#xff0c;如何获取用于分析的数据集呢&#xff1f; 1、获取现成…...

前端常用的设计模式

设计模式&#xff1a;是一种抽象的编程思想&#xff0c;并不局限于某一特定的编程语言&#xff0c;而是在许多语言之间是相通的&#xff1b;它是软件设计中常见的问题的通用、可反复使用、多少人知晓的一种解决方案或者模板。一般对与从事过面向对象编程的人来说会更熟悉一些。…...

游戏引擎支持脚本编程有啥好处

很多游戏引擎都支持脚本编程。Unity、Unreal Engine、CryEngine等大型游戏引擎都支持使用脚本编写游戏逻辑和功能。脚本编程通常使用C#、Lua或Python等编程语言&#xff0c;并且可以与游戏引擎的API进行交互来控制游戏对象、设置变量、执行行为等。使用脚本编程&#xff0c;游戏…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用

前言&#xff1a;我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM&#xff08;Java Virtual Machine&#xff09;让"一次编写&#xff0c;到处运行"成为可能。这个软件层面的虚拟化让我着迷&#xff0c;但直到后来接触VMware和Doc…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...