java学习--集合(大写一.1)

news2024/10/23 14:21:59

看尚硅谷视频做的笔记

1.集合框架概述

1.1生活中的容器

首先知道集合是来解决什么问题的?
在这里插入图片描述

1.1.1内存层面需要针对于多个数据进行存储,此时,可以考虑的容器有:数组、集合类

对于内存层面的来说,断电后数据就不复存在,内存层面的数据都是一些临时性处理的数据。跟数据库的数据不是一个维度。
在这里插入图片描述

就相当于数据是先从数据库读到内存中,数据库的数据可以用数组去存、也可以用集合去存储。
在这里插入图片描述

1.2 数组的特点、弊端

1.2.1数组存储多个数据方面的特点

①数组一旦初始化,长度就确定了。
②存储的数据有相关特点:依次紧密排列,并且是有序、可重复的
③优点:数组一旦初始化完成,其元素的的类型就是确定的,不是此类型的元素,就不能添加到此数组中。

声明int类型,就只能是int类型,声明是String类型,就只能是String类型

在这里插入图片描述

int [ ] arr=new int[10];
arr[0]=1;
arr[1]=‘AA’//编译报错;
在这里插入图片描述
在这里插入图片描述
想体现更灵活的用户,就声明为Object类型数组
Object obj=new Object[];
obj[0]=‘AA’;
obj[1]=1;
obj[2]=new String();
obj[3]=new Date();
在这里插入图片描述
在这里插入图片描述

④优点:元素的类型即可以是基本数据类型,也可以引用数据类型。

集合中的元素存放只能是基本数据类型,不能是引用数据类型。若你集合中有基本类型的需求那只能用包装类的对象往里放,就只能放对象特征。
对集合来讲,其实对类型没有什么要求,可以随便往里放数据类型。不会对类型进行检查,这样就会使得容器里的东西比较杂,不安全,怎么办?下一章会讲1泛型,性新特性。泛型就专门限制往集合里放的类型。
泛型类型,写的是String,就只往里放String,其他类型就放不进去。
泛型就可以达到跟数组一样的特征。

在这里插入图片描述

1.2.2数组存储多个数据方面的弊端

①数组一旦初始化,长度就不可变了。

在这里插入图片描述
数组new的时候在堆空间是一整块空间

在这里插入图片描述
1和1就可以看成是可以重复的
在这里插入图片描述

在这里插入图片描述

②数组中存储数据特点的单一性、对于无序、不可重复的常见的多个数据就无能为力了
③数组中可用的方法、属性都极少,具体的需求,都需要自己组织相关的代码逻辑。

在这里插入图片描述

④针对于数组中的元素的删除、插入操作、性能较差,原因是因为:存储的数据、依次紧密排列,

在这里插入图片描述

1.3Java集合框架体系

在这里插入图片描述

这章整体是从接口体系出发的
像之前讲异常体系都是从类出发threable \errable\exception

比较典型的接口有两个:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3.1 java.util.Collection接口:存储一个一个的数据

在这里插入图片描述

①------List子接口:有序可以重复的数据
List子接口下面具体的实现类:ArrayList(主要的实现类)、LinkedList、Vector
②------Set子接口:无序不可重复的数据
Set子接口下面具体的实现类:HashSet(主要的实现类)、LinkedHashSet、TreeSet

1.3.2 java.util.Map接口:存储一对一对的数据(key-value,一个key对应一个value,键值对数据)

在这里插入图片描述

一个x1对应一个y1,一个x2对应一个y2,综合就相当于是函数y=f(x)

Map会有针对于key、value的要求,不同的key可以指向同一个value,一个key不能指向多个value
y=x ^2

x=-1,x=1,y=1

Map这里也是一样,不同key可以指向同一个value,同一个key不能指向多个value

在这里插入图片描述在这里插入图片描述
跟Collection并列的接口Map,Map没有子接口

①直接提供的具体的实现类HashMap(主要的实现类)、LinkedHashMap、TreeMap、Hashtable、Properties

HashSet的底层就是HashMap
LinkedHashSet的底层是LinkedHashMap
TreeSet的底层是TreeMap
在这里插入图片描述
在这里插入图片描述

1.3.3怎么理解List存储有序可以重复的数据?

List跟前面的数组有些类似:称为动态数组,可以动态扩展底层数组的长度。
其实List就可以替换以前的数组,具体用的话就是实现类,ArrayList是作为主要的实现类

在这里插入图片描述

我们要做的就是具体的实现类是谁,怎么创建对象?怎么用常用的方法完成项目的需求

1.4集合的使用场景

1.4.1无序不可重复的使用场景:黑名单、手机骚扰电话拦截

黑名单其实就是一个Set集合,加进黑名单后,就没有必要再加一份

在这里插入图片描述
红色圈住的都是可以理解为对象,这里面就有多个对象,多个对象就考虑容器去装,上下是有顺序讲究,以前是数组,现在可以用集合List实现类,ArrayList去装数据即可
在这里插入图片描述
这一项可以用对象去封装数据,也可以不用对象去封装,可以用一个Map容器
Map容器是一个键值对
在这里插入图片描述
下面圈住的红色结构
里面都是key,key可以理解成一个标签
在这里插入图片描述
key在这里是image,imagepath对应的是url地址,即就是键值
多个Map构成List
在这里插入图片描述
安卓或者pc客户端发送请求到服务端,服务端可以用java代码去编写逻辑,java可以去访问数据库
数据库返回的是数据是结果集给java层面的代码最后再响应给客户端即就是看到的页面数据
本质上页面的数据都是来自数据库,java的作用就是根据用户的个性化请求访问数据库返回给客户端,在服务器的层面写的都是java代码,针对于数据可以使用List、Map进行去装数据,至于返回到客户端是什么样的格式,暂时不多说。
在这里插入图片描述

1.5学习的程度把握

1.5.1 层次一:针对于具体特点的多个数据,知道选择相应的适合的接口主要实现类,会实例化,会调用常用的方法。

在这里插入图片描述

1.5.2 层次二:区分接口中不同的实现类的区别

在这里插入图片描述

1.5.3 层次三:①针对于常用的实现类,需要熟悉底层源码。②熟悉常见的数据结构(第14章讲)

后面就先讲Collection,再讲Map
在这里插入图片描述

2.collection接口及方法

jdk8里有一些默认的方法,更多的是体现的是一种规范,规范更多关注的是一些抽象方法。
看接口里面的抽象方法,选一个具体的实现类。
测试collection的方法,存储一个一个数据都有哪些功能方法可以进行调。
因为是接口,想演示接口中的方法,就需要先声明Collection
在这里插入图片描述

右边一定要选一个实现类,即就用ArrayList
此处就使用了多态
在这里插入图片描述

多态
场景时调的时候.
coll.时候只能调出Collection接口里面声明的方法
在这里插入图片描述
所以借着右边ArrayList看左边Collection接口的方法
具体执行还是右边ArrayList中的方法,那右边执行方法就等于左边Collection方法吗?(虽然接口中的方法么没有方法体,方法的用途是确定的,所以此处不影响去理解Collection接口中的方法)
在这里插入图片描述
COllection用ctrl+c,再打开API
在这里插入图片描述

在jdk8加了静态方法和默认方法,现在暂时不关注,后面String的Api再关注
在这里插入图片描述
现在关注的都是抽象方法,15个抽象方法
在这里插入图片描述
如果自己设计一个Collection,去存储一个一个的数据,会设计哪些方法?

2.1 添加

2.1.1add(E obj)添加元素对象到当前集合中,一个一个添加元素

在这里插入图片描述
在这里插入图片描述
123基本数据类型,此处是自动装箱操作在这里插入图片描述
在这里插入图片描述
造一个自定义类的对象Person
在这里插入图片描述
提供name,age,再提供空参构造器
在这里插入图片描述
再提供带参构造器
在这里插入图片描述
get,set方法省略,提供toString方法
在这里插入图片描述
new一个Tom
在这里插入图片描述
以上就添加了5个对象

此处打印的时候里面也调了toString方法d在这里插入图片描述
就将对象打印了出来
在这里插入图片描述

2.1.2addAll(Collection other):添加other集合中的所有元素对象到当前集合中,即this=this U other

(将参数中的元素都加到当前集合中coll)
在这里插入图片描述

新建coll1
在这里插入图片描述
对coll1加点数据,加完后进行调用addAll方法,再进行打印
在这里插入图片描述
在原有的数据上又加了两个数据,原先是5个元素,现在加了两个数据后是7个元素
在这里插入图片描述
size获取集合中元素个数的方法
在这里插入图片描述
在这里插入图片描述

2.1.3注意:add和addAll的区别

coll.add是将coll1集合看成是整体的一个元素
在这里插入图片描述
此时再查询集合元素的个数就是6
在这里插入图片描述
整个coll1集合中的元素充当了一个元素
在这里插入图片描述

在这里插入图片描述

2.2判断

2.2.1 int size()获取当前集合中实际存储的元素个数

2.2.2 boolean isEmpty()获取当前集合中是否为空集合

判断集合是否为空,false
在这里插入图片描述
在这里插入图片描述

2.2.3 boolean contains(Object obj)判断当前集合中是否存在一个与obj对象equals返回true的元素

判断是否包含AA
在这里插入图片描述
返回值为true
在这里插入图片描述
coll.contains(128),返回的结果为true
coll.contains(128)此处是自动装箱,128此处已经超出了数组的范围,这就是新new的,
在这里插入图片描述

在这里插入图片描述
这个包含的128是新new的,此处比较的不是==,不是比地址,
在这里插入图片描述

举例说一下,此处new的是一个String在这里插入图片描述
判断是否包含,此处返回也是true,比较的不是地址,而是比较的是内容
在这里插入图片描述
调的是equals方法,String和Integer都重写过,即都是true
在这里插入图片描述

此处这样是true
在这里插入图片描述

此处运行返回后,是false
System.out.println(coll.contains(new Person(“Tom”,12)));此处按理说调的还是equals方法-再去看Person类的代码,Person类的代码里没有重写equals方法,用的是Object里的equals方法就是==,进行地址比较

在这里插入图片描述
在这里插入图片描述
这两个地址相比显然不一样,即就是false
在这里插入图片描述
在这里插入图片描述
一般调contains时都是调的是equals方法,就是比内容,对于自定义对象的这种想往集合里放元素,都要求在自定义类中重写equals方法alt+insert 在这里插入图片描述

在这里插入图片描述
hashcode代码用不着可以进行注释
在这里插入图片描述
可以发现调用了几次
在这里插入图片描述
调用了四次
在这里插入图片描述

contains若添加的是自定义的类的对象,就需要在自定义类中加上重写的equals方法

2.2.4 boolean containsAll(Object obj)判断coll集合中的元素是否在当前集合中都存在,即coll集合中的元素是否在集合中的子集。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2.5 boolean equals(Object obj):判断当前集合与obj是否相等

在这里插入图片描述
在这里插入图片描述

2.3删除

在这里插入图片描述

2.3.1 void clear():从当前集合中删除第一个找到的与obj对象equals返回true的元素

在这里插入图片描述
在这里插入图片描述
打印size为0,不是空指针的原因是test3方法里有Collection p1=new ArrayList()对象
在这里插入图片描述
在这里插入图片描述
clear方法的原理
Collection p1=new ArrayList(),ArrayList集合底层也是数组
此处只能是放对象,都是Object,此处都是放的地址值(因为是引用类型)
在这里插入图片描述

在这里插入图片描述
地址值再指向new的对象
在这里插入图片描述

一个一个进行清理掉(而不是size为0,防止内存泄漏)
在这里插入图片描述

2.3.2 boolean remove(Object obj):删除指定元素。从当前集合中删除所有与coll集合中相同的元素,即this=this-this交集 coll

在这里插入图片描述
在这里插入图片描述
此处new一个person,能否删掉
在这里插入图片描述
此处删掉了,删的话判断有新new的对象就会进行删除,判断有没有时调的是equals方法(肯定有啊),有就会进行删除,remove是一旦找到了想要删除的元素就会停止进行操作

在这里插入图片描述

2.3.3 boolean removeAll(Collection coll):删除集合中的所有元素。从当前集合中删除两个集合中不同的元素,使得当前集合仅留与coll集合中的元素相同的元素,即当前集合中仅保留两个集合的交集。即this=this交集 coll

coll.removeAll(coll1)删除coll1所有元素
差集的意思
在这里插入图片描述

2.3.4boolean retainAll(Collection coll):从当前集合中仅保留与coll集合中的元素相同的元素、即当前集合中仅保留两个集合的交集,即this=this交集coll

即是交集
在这里插入图片描述

2.4其他在这里插入图片描述

2.4.1Object[] toArray():返回包含当前集合中所有元素的数组,集合—>数组

在这里插入图片描述
先整一个集合过来
在这里插入图片描述
集合怎么转换成数组
在这里插入图片描述
返回值是用Object类型数组进行装(因为添加的时候都是Object)
在这里插入图片描述
看一下数组具体的元素都有哪些?此处有一个简便的方法
在这里插入图片描述
这就是数组中的元素
在这里插入图片描述

2.4.2hashcode[]:获取集合对象的哈希值

在这里插入图片描述

2.4.2iterator:返回迭代器对象,用于集合遍历

2.5总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5.1.常用方法:Collection中定义了15个抽象方法

add(Obj obj)
addAll(Collection coll)
size()
isEmpty()
contains(Object obj)
cotainsAll(Collection coll)
retainAll(Collection coll)
hashCode()
remove(Object obj)
removeAll(Collecion coll)
clear()
Iterator()
toArray()

2.5.1.集合与数组之间的相互转换

2.5.1.1 集合---->数组:toArray()方法,返回类型是一个Object类型的数组Object[]

在这里插入图片描述
在这里插入图片描述

2.5.1.2 数组---->集合:调用Arrays的静态方法asList(Object …obj)

在这里插入图片描述

数组转集合,首先要有数组,数组有一个工具类Arrays
在这里插入图片描述
Arrays有一个方法asList(T…a),形参是一个可变形参,此处就可以放可变数组
在这里插入图片描述
假设有一个数组arr,形参就是arr数组

在这里插入图片描述
返回值就是一个集合

alt+回车自动生成返回类型
在这里插入图片描述
泛型暂时没见过,先删除
List是Collection的子接口,即就是collection
在这里插入图片描述
即就转换成了collection
在这里插入图片描述

打印list
在这里插入图片描述
在这里插入图片描述
这种写法也是可以的
在这里插入图片描述
在这里插入图片描述

2.5.1.3 注意
① 场景1

此处有一个小细节,此时的代码是自动装箱
在这里插入图片描述
在这里插入图片描述
此处有多少个元素?
在这里插入图片描述

② 场景2

问下面的size是多少?
在这里插入图片描述asList只能放对象,不能放基本数据类型,只能将整个数组看成是一个对象,即就是一个元素,而对于Integer他是自动装箱后的对象
在这里插入图片描述

在这里插入图片描述

打印一下list、list1的元素的情况
在这里插入图片描述
第二个[[I@1888ff2c]是int类型的一维数组在这里插入图片描述

2.5.1.向Collection中添加元素的要求:要求元素所属的类一定要重写equals方法

在这里插入图片描述
在这里插入图片描述
因为调contains或者remove方法时,他要去调obj所属类的equals方法,调equals比较的是内容,若不重写的话会去调用Object中的==不太合适
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1843217.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

玩转Matlab-Simscape(初级)- 10 - 基于COMSOLSimulink 凸轮机构的控制仿真

** 玩转Matlab-Simscape(初级)- 10 - 基于COMSOL&Simulink 凸轮机构的控制仿真 ** 目录 玩转Matlab-Simscape(初级)- 10 - 基于COMSOL&Simulink 凸轮机构的控制仿真 前言一、简介二、在Solidworks中创建3D模型&#xff…

强化学习和Q-Learning的综合研究

目录 一、说明 二、什么是强化学习? 三、监督学习、无监督学习和强化学习之间的区别。 四、强化学习中使用的术语。 五、强化学习中的智能体-环境交互:一个迷宫示例。 六、贝尔曼方程。 七、马尔可夫决策过程 (MDP) 八、马尔可夫决…

WebHttpServletRequestResponse(完整知识点汇总)

额外知识点 Web核心 Web 全球广域网,也成为万维网(www),可通过浏览器访问的网站 JavaWeb 使用Java技术来解决相关Web互联网领域的技术栈 JavaWeb技术栈 B/S架构:Browser/Server,即浏览器/服务器 架构模式…

功能测试 之 单模块测试----轮播图、登录、注册

单功能怎么测? 需求分析 拆解测试点 编写用例 1.轮播图 (1)需求分析 位置:后台--页面--广告管理---广告列表(搜索index页面增加广告位2) 操作完成后需要点击admin---更新缓存,前台页面刷新生效 (2)拆解…

生信算法8 - HGVS转换与氨基酸字母字母表

HGVS 概念 HGVS 人类基因组变异协会(Human Genome Variation Society)提出的转录本编号,cDNA 参考序列(以前缀“c.”表示)、氨基酸参考序列(以前缀“p.”表示)。cDNA 中一种碱基被另一种碱基取代,以“>”进行表示,如:c.2186A&…

ETO MARKETS:美债高额利息——美国财政的不可承受之重

摘要 2024年,美国联邦政府债务的利息支出预计将达到8920亿美元,这一数字比国防开支还要多,凸显了政府债务和利率上升的双重压力。国会预算办公室(CBO)预测,利息支出占GDP的比例将继续上升,这意…

【IDEA】Spring项目build失败

通常因为环境不匹配需要在file->projectstructure里面调整一下。

Flink Sql Redis Connector

经常做开发的小伙伴肯定知道用flink连接redis的时候比较麻烦,更麻烦的是解析redis数据,如果rdis可以普通数据库那样用flink sql连接并且数据可以像表格那样展示出来就会非常方便。 历时多天,我终于把flink sql redis connector写出来了&…

性能测试(五)—— 数据库性能测试-mysql

1 mysql性能测试的主要内容 MySQL数据库介绍MySQL数据库监控指标MySQL慢查询工作原理及操作SQL的分析与调优方法MySQL索引的概念及作用MySQL索引的工作原理与设计规范MySQL存储引擎MySQL实时监控MySQL集群监控方案MySQL性能测试的用例准备使用Jmeter开发MySQL性能测试脚本执行…

【从零到一】电子元器件网站建设/开发方案、流程及搭建要点全解

电子元器件行业在数字化转型的大潮下也迎来了前所未有的发展机遇。一个高效、专业、用户友好的电子元器件网站,不仅能够提升品牌形象,还能显著提高销售转化率,增强客户粘性。道合顺芯站点将详细阐述电子元器件开发方案、实施流程,…

【ai】tx2-nx:搭配torch的torchvision

微雪的教程pytorch_version 1.10.0 官方教程安装torch官方教程 依赖项 nvidia@tx2-nx:~/twork/03_yolov5$ $ sudo apt-get install libjpeg-dev zlib1g-dev lib

如何避免群发引起反感?

微信群发信息引起反感主要是因为缺乏情感,尽管最初微信群发旨在传递有价值信息,但由于滥用,现在人们对其印象非常负面。但是,还是有办法挽救的! 群发消息时按照这3个标准发,可以避免被反感。 1、短信群发目…

wps要会员才能把pdf分开,这不纯属智商税吗

我有一个文档 然后 我给你们写好了一个代码 from PyPDF2 import PdfReader, PdfWriterdef split_pdf(file_path, ranges, output_names):# Open the input PDF filewith open(file_path, rb) as pdf_file:reader = PdfReader(pdf_file)total_pages = len(reader.pages)if len…

Humanize,一个很有人情味的 Python 库

目录 01初识 Humanize 为什么选择 Humanize? 安装 Humanize 02时间与日期的处理 时间差的展示 日期的展示 03数字的处理 数字的单位转换 数字的精确度控制 数字的千位分隔符 04文件大小的处理 文件…

【Linux工具】yum软件包管理器与Vim编辑器的高效运用

目录 Linux 软件包管理器 YUM 什么是软件包 安装工具 rzsz 及注意事项 查看软件包 安装和卸载软件 安装软件 卸载软件 Linux 开发工具 编辑器 - Vim 使用 ​编辑 Vim 与 Vi 的区别 Vim 的基本概念 三种模式 Vim 的基本操作 操作尝试: Vim 命令集解释…

Windows更新报错 0xc1900101 0x30018 解决方案

卸载自带的电脑管家(比如华硕、联想、华为等) 通过禁用第三方驱动启动Windows(winr 运行 msconfig),然后禁用掉第三方服务,重启系统。 检查更新,应该问题就能解决 记得重新运行msconfig&…

【机器学习】线性回归:从基础到实践的深度解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 线性回归:从基础到实践的深度解析引言一、线性回归基础1.1 定义与目…

Electron+vite+vuetify项目搭建

最近想用Electron来进行跨平台的桌面应用开发。同时想用vuetify作为组件,于是想搭建一个这样的开发环境。其中踩了不少坑,总是会出现各种的编译错误和问题,依赖的各种问题,搞了好久最终环境终于弄好可正常开发了。这里分享下快速搭…

最新OPPO 真我手机 一加手机 使用adb命令永久关闭系统更新教程

使用adb命令永久关闭系统更新 一、先了解手机系统二、Android 11 以下使用adb 命令永久关闭系统更新1、adb 官方下载2、小白开启 USB 调试模式教程(熟手跳过)三、Android 12 以上使用adb 命令永久关闭系统更新什么您还是不会弄!赞赏我&#x…

git中的多人协作开发场景

✨前言✨ 📘 博客主页:to Keep博客主页 🙆欢迎关注,👍点赞,📝留言评论 ⏳首发时间:2024年6月20日 📨 博主码云地址:博主码云地址 📕参考书籍&…