集合注意事项

目录

我们为什么要用到集合中的迭代器

List实现类的循环遍历

Set集合

HashSet

TreeSet

Map

Hashmap

Treemap

Hashtable

map的遍历方式

Collections的一些静态方法


我们为什么要用到集合中的迭代器

List实现类的循环遍历

如图我们对arraylist中加入了三个相同的“a”时,使用for循环遍历删除会发现有漏网之鱼,为什么会出现这种现象呢?因为集合arraylist在删除时不会和数组一样不动,而是将后面的元素全部向前移动,这导致了i++之后变成了1删除了【a,a】删除了第三个"a",但是第二个“a”被保留了下来.

如图我们使用了增强for循环,这时对for循环的一种包装,我们在使用时会出现异常报错,在使用增强for循环时不可以进行增添或删除,所以我们不能用增强for循环。

如图我们可以显而易见的看到使用迭代器的方法将“a”全部删除了,这主要是由于迭代器内部有一个cursor(指针)从0开始遇到next()自动加一 遇到remove()自动减一,简而言之就是拿到先拿到第0个元素,然后指针向后移动一个,如果remove()则删除第0个元素,指针减一.可以debug试试.

以上三个图就是为什么使用迭代器的原因。

这是list迭代器 在arraylist linklist vector才可以用 功能更加丰富.

Set集合

Set接口:不重复元素、无索引

List接口:可重复、有索引(linklist也有存在node里了

HashSet

hashset:哈希无序.

如何判断hashset中元素重复?

答:可以用equals来判断元素是否重复,但是equals底层实现在String类中是通过一个字符一个字符比较的这样的方法太慢了.所以我们在添加元素时底层会用hashCode()和equals()两种方法,先通过哈希值比较是否相等,用hash值比较时速度是很快,但是hash值是不安全不可靠的(有可能内容不同但是hash值相同),所以我们先判断哈希值是否相等,如果不相等直接pass,如果相等则为了安全考虑在使用equals()来逐个比较.既提高了效率又保证了安全.

如果将学生对象存储到hashSet中又该如何判断呢?

根据上一问的回答可知我们先判断hashCode()是否相等,hashCode()是Object类中定义的方法,所以创建的student类默认是具有hashCode()方法,但是Object中的hashCode()方法是返回内存地址如果通过new创建一个对象的话,则不管内容如何他们的内存地址都不相同。所以我们需要重写hashcode()方法和equals()方法。注意:从源码中可以得知时第二条重复数据将第一条数据覆盖了,而不是没添加进来.

重写hashcode和equals方法

结果显示则只有一条101 张三.

TreeSet

底层是树型结构,添加进来的元素可以排序(有序的,不是添加顺序,是元素的自然顺序)

我们如果使用普通的二叉树存储的话,遇到数据递增的情况则会出现如下图

这和链表就没什么区别了,我们用二叉树主要是能降低高度查找更快。

所以底层一般使用红黑树,递增是会进行旋转.

hashset中又是如何实现自然排序的呢?

答:和hashset的逻辑一样,不过是需要实现Comparable接口并重写compareTo()方法比较.

如果compareTo()的返回值为0则表示相等不会再添加对象到集合中去.

注意Comparable<Student>这个泛型要写,不然comparaTo方法中的参数类型就是Object类型还要向下转型。

Map

Hashmap

hashmap:无序 键不同(后键覆盖前键) 值可以相同 

hashset底层用的就是new hashmap()将值put( value,默认值)放到key列里面。

hashmap中有 map.values()方法拿到所有的value返回一个Collection<>中,也又keySet()方法拿到所有key放到Set<>集合中。

Hashmap底层的三种结构:

1.hash数组(锁定元素位置node<k,v>[ ])扩容为原来的2倍,阈值为0.75(数组被使用到0.75时就会扩容)

2.链表(存储多个元素node(key,val)) 

3.红黑树(存储多个元素)

添加元素时,先计算元素hash值%数组长度(实际源码中时按位与hash值)得到元素位置,我们在存储时在同一个位置上使用链表的长度过长时(源码中长度>=8时且源码中想要创建红黑树还有一个条件是数组的长度需要大于等于64否则resize()对数组扩容会打乱原有链表排序)查询效率降低,这时我们将链表变为红黑树来提高查询效率。

这个图是我用smileNicky这个博主的图片 在扩容时的机制,源码也是这个意思.

Treemap

Treemap中的key 需要又comparable接口实现comparaTo方法

总的来说Tree和hash去重一个是compara去重一个是hashcode加equals去重

Hashtable

和hashmap底层相同 但是线程安全

和hashmap相比key不能为null,value也不能为null。

map的遍历方式

方式一:使用keyset集合拿到key值 增强for循环或者用迭代器遍历都可以

第二种也是map遍历最常用的方法可以拿到key也可以拿到value

entry是我们在用map中的一个内部类添加元素时维护的将键值对放到entry里面更方便遍历.

Collections的一些静态方法

类型.....参数名,可变长度参数,例如test(1,2,3,4) public static void test(int....a).

一个参数列表中只能有一个可变长度参数,而且必须放到末尾(int a,int....b)

Collections.addAll(arraylist,3,4,5,6)把3 4 5 6添加到arralist中

Collections.sort(arraylist)对集合进行排序

Collections.binarySearch(arraylist,1)排序后进行二分查找法找值

Collections.swap(arraylist,0,4)把第0个位置和第四个位置交换

Collections.copy(arraylist,arraylist1)把后面的集合元素复制到前面,前提是前面的集合长度必须大于后面,会把相同位置的元素覆盖成arraylist1中的元素.

Collections.fill(arraylist,0)将0填满数组

Collections.reverse(arraylist)逆序,也可以用迭代器ListIterator每次打印上一个元素

Collections.shuffle(arraylist)随即打乱集合

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软件工程】【22.04】p1

关键字&#xff1a; 软件需求规约基本性质、数据字典构成、内聚程度最高功能内聚、公有属性、RUP实体类、评审、测试序列、软件确认过程、CMMI能力等级 软件需求分类、DFD数据流图组成&#xff08;实体&#xff09;、经典详细设计、数据耦合、关联多重性、状态图、黑盒测试、…

使用ESP32和Flask框架实现温湿度数据监测系统

项目概述 在这个项目中&#xff0c;我们将使用ESP32微控制器读取温湿度传感器的数据&#xff0c;并将这些数据通过HTTP请求传输到基于Flask框架的服务器。Flask是一个轻量级的Python Web框架&#xff0c;非常适合快速开发和部署Web应用。通过这个项目&#xff0c;我们不仅可以了…

分享uniapp + Springboot3+vue3小程序项目实战

分享uniapp Springboot3vue3小程序项目实战 经过10天敲代码&#xff0c;终于从零到项目测试完成&#xff0c;一个前后端分离的小程序实战项目学习完毕 时间从6月12日 到6月22日&#xff0c;具有程序开发基础&#xff0c;第一次写uniapp,Springboot以前用过&#xff0c;VUE3也…

外部存储器

外部存储器是主存的后援设备&#xff0c;也叫做辅助存储器&#xff0c;简称外存或辅存。 它的特点是容量大、速度慢、价格低&#xff0c;可以脱机保存信息&#xff0c;属于非易失性存储器。 外存主要有&#xff1a;光盘、磁带、磁盘&#xff1b;磁盘和磁带都属于磁表面存储器…

跌倒识别:守护公共安全的AI技术应用场景-免费API调用

随着科技的不断进步&#xff0c;人工智能在各个领域的应用日益广泛&#xff0c;其中在公共安全领域&#xff0c;智能跌倒识别系统正逐渐成为守护人们安全的重要工具。本文将分享智能跌倒识别系统在不同场景下的应用及其重要性。 产品在线体验地址-API调用或本地化部署 AI算法模…

4、MFC:菜单栏、工具栏与状态栏

菜单栏、工具栏与状态栏 1、菜单栏1.1 简介1.2 创建属性设置菜单消息成员函数 1.3 实例 2、工具栏2.1 简介工具栏属性2.2 创建消息CToolBar类的主要成员函数 2.3 实例 3、状态栏3.1 简介3.2 创建CStatusBar类状态栏创建 3.3 实例 1、菜单栏 1.1 简介 菜单在界面设计中是经常使…

【AWS SMB】关于AWS 中小型企业 (SMB) 能力介绍及注意事项

文章目录 前言一、什么是 SMB&#xff1f;&#x1f4e2;二、如何识别中小企业的需求三、中小企业营销活动的类型四、AWS 合作伙伴可获得的其他 AWS 机会4.1 AWS IQ4.2 APN 客户参与 (ACE) 计划 前言 AWS 中小型企业 &#xff08;SMB&#xff09; 能力合作伙伴专注于帮助中小型…

荒野大镖客2启动找不到emp.dll的7个修复方法,轻松解决dll丢失的办法

一、emp.dll文件丢失的常见原因 安装或更新问题&#xff1a;在软件或游戏的安装过程中&#xff0c;可能由于安装程序未能正确复制文件到目标目录&#xff0c;或在更新过程中文件被意外覆盖或删除&#xff0c;导致emp.dll文件丢失。 安全软件误删&#xff1a;某些安全软件可能…

甘肃旅游服务平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;公告信息管理&#xff0c;景点管理&#xff0c;酒店管理&#xff0c;基础数据管理&#xff0c;美食管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0…

在 Equinix 上使用 MinIO 控制云数据成本

公有云改变了公司构建、部署和管理应用程序的方式&#xff0c;主要是向好的方向发展。在您刚开始使用时&#xff0c;公有云会提供基础架构、服务、支持和维护&#xff0c;以便快速启动和运行。它以几乎无限的方式提供最终的可伸缩性&#xff0c;无论应用程序的负载如何&#xf…

小米15系列将首发骁龙8 Gen4 SoC

高通已确认2024年骁龙峰会定于10月21日举行。在这次峰会中高通将推出其最新的移动芯片Snapdragon 8 Gen4 SoC。著名科技博主DigitalChatStation今天证实&#xff0c;骁龙8 Gen4将以小米15系列首次亮相。这意味着小米15系列将是第一款使用这款新旗舰处理器的手机。 这不是小米第…

和琪宝的厦门之旅~

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作)&#xff0c;由 李兆龙 确认&#xff0c;转载请注明版权。 引言 承接去年国庆的遗憾&#xff0c;我们将这次的旅行城市定为厦门。 琪宝是下午四点左右到…

湖南(市场调研)源点咨询 新产品上市前市场机会调研与研究分析

湖南源点调研认为&#xff1a;无论是创业公司&#xff0c;还是在公司内部探索新的项目或者新的产品线等&#xff0c;首先都要做“市场机会分析与调研“&#xff0c;要真正思考并解答以下疑问&#xff1a; 我们的目标客户群体是谁&#xff0c;他们如何决策&#xff1f; 我们所…

长尾式差分放大电路调零

长尾式放大电路用了两个参数相同的三极管&#xff0c;但实际上并没有完全相同的三极管&#xff0c;所以为了提高差分放大电路的对称性(一边电流增加多少&#xff0c;另一边电流减小多少&#xff0c;即能在电阻Re上产生的压降不变(后面做虚地处理))&#xff0c;在下图中加入可调…

FaceFusionSharp OnnxRuntime版 视频换脸

FaceFusionSharp OnnxRuntime版 视频换脸 目录 效果 项目 代码 下载 其他 效果 FaceFusionSharp OnnxRuntime版效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Threading; using System.Window…

vivado、vitis2022安装及其注意事项(省时、省空间)

1、下载 AMD官网-资源与支持-vivado ML开发者工具&#xff0c;或者vitis平台&#xff0c; 下载的时候有个官网推荐web安装&#xff0c;亲测这个耗时非常久&#xff0c;不建议使用&#xff0c;还是直接下载89G的安装包快。 注意&#xff1a;安装vitis平台会默认安装vivado&…

Android补间动画、帧动画、属性动画详解

View Animation&#xff1a; 视图动画在古老的Android版本系统中就已经提供了&#xff0c;只能被用来设置View的动画。 Drawable Animation&#xff1a; 这种动画&#xff08;也叫Frame动画、帧动画&#xff09;其实可以划分到视图动画的类别&#xff0c;专门用来一个一个的显…

UE4_材质_湿度着色器及Desaturation算法_ben材质教程

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿美好生活越来越好。 效果图&#xff1a; 原图&#xff1a; 1、使用初学者内容包的材质 我们这里使用虚幻自带的材质M_Brick_Clay_Old,复制一个更名为M_Brickclayoldwet材质。 2、添加去饱和度Desaturation节…

数据库精选题(三)(SQL语言精选题)(按语句类型分类)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;数据库 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 创建语句 创建表 创建视图 创建索引…

【一】【算法】经典树状数组和并查集,详细解析,初步认识,【模板】树状数组 1,树状数组并查集

【模板】树状数组 1 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某一个数加上 x x x 求出某区间每一个数的和 输入格式 第一行包含两个正整数 n , m n,m n,m&#xff0c;分别表示该数列数字的个数和操作的总个数。 第二…