集合注意事项

news2024/12/27 13:01:33

目录

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

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)随即打乱集合

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

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

相关文章

汽车OTA--Flash RWW属性为什么这么重要

目录 1. OTA与RWW 1.1 FOTA需求解读 1.2 什么是RWW 2.主流OTA方案 2.1 单Bank升级 2.2 基于硬件A\B SWAP的FOTA方案 2.3 基于软件实现的FOTA方案 3.小结 1. OTA与RWW 1.1 FOTA需求解读 CP AUTOSAR R19-11首次提出了FOTA的概念&#xff0c;针对FOTA Target ECU提出了多…

适耳贴合的气传导耳机,带来智能生活体验,塞那Z50耳夹耳机上手

现在大家几乎每天都会用到各种AI产品&#xff0c;蓝牙耳机也是我们必不可少的装备&#xff0c;最近我发现一款很好用的分体式气传导蓝牙耳机&#xff0c;它还带有一个具备AI功能的APP端&#xff0c;大大方便了我们日常的使用。这款sanag塞那Z50耳夹耳机我用过一段时间以后&…

以太坊==使用IDE remix.ethereum搭配metamask发布合约到测试网

IDE地址 Remix - Ethereum IDE 编写代码 部署&#xff0c;选择metamask 查看 部署成功后&#xff0c;可以看到详情地址&#xff0c;查看详情&#xff0c;所以发布合约就是一个TX https://sepolia.etherscan.io/tx/0xe62a0b03ec9f55702cd06f36447fd3c50450a948d59d03c381d97…

postman测试接口使用

背景&#xff1a; 隔了一段时间没有用postman&#xff0c;有些忘记了&#xff0c;谨以此文来记录postman的使用&#xff0c;如有忘记就可以快速回忆 使用&#xff1a; 点击这个号&#xff0c;是创建接口页面 这里的复选框可供我们选择接口的rest方式 请求路径&#xff1a; …

Google trend搜索关键词

Google trend地址&#xff1a;https://trends.google.com/trends/?geoUS&hlzh-CN 1、具体的操作步骤如下&#xff1a; 2、Google trend搜索页面如下&#xff1a;

【金】?Y? python网页前端streamlit

1、如何从 Google Colab Notebook 启动 streamit参考-How to Launch Streamlit App from Google Colab Notebook !streamlit run web.py & npx localtunnel --port 8501 & curl ipv4.icanhazip.com

spire.Pdf 将pdf转成image

一、nuget安装 <ItemGroup><PackageReference Include"Spire.PDF" Version"10.6.7" /></ItemGroup> 二、直接上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.IO;namespace …

1962springboot VUE社区服务平台系统开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot VUE社区服务平台系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架和VUE完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和…

微型操作系统内核源码详解系列五(四):cm3下svc启动任务

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…

ctfshow 2023 愚人杯 web

easy_signin 观察url&#xff0c;发现base64 &#xff0c;进行解码&#xff0c;原来可以访问文件路径&#xff0c;那我们访问一下index.php ?imgaW5kZXgucGhw查看源代码发现还是base64 解码得到flag 被遗忘的反序列化 <?php# 当前目录中有一个txt文件哦 error_reporti…

SpringBoot测试实践

测试按照粒度可分为3层&#xff1a; 单元测试&#xff1a;单元测试&#xff08;Unit Testing&#xff09;又称为模块测试 &#xff0c;是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中…

SQlyog连接到主机时报错:错误号码2058Plugin sha256 password could not be loaded

1.问题重述 MySQL版本&#xff1a;8.4.0 SQlyog连接到主机时报错&#xff1a;错误号码2058Plugin sha256 password could not be loaded&#xff0c;如下图 经过查阅资料得知出现这个问题是因为 mysl8之前的加密规则是 mysql_native_password &#xff0c;而在mysql8之后&…

Python神经影像数据的处理和分析库之nipy使用详解

概要 神经影像学(Neuroimaging)是神经科学中一个重要的分支,主要研究通过影像技术获取和分析大脑结构和功能的信息。nipy(Neuroimaging in Python)是一个强大的 Python 库,专门用于神经影像数据的处理和分析。nipy 提供了一系列工具和方法,帮助研究人员高效地处理神经影…

Flutter学习:从搭建环境到运行

一、开发环境的搭建 本文所示内容都是在Windows系统下进行的。 1、下载 Flutter SDK Flutter 官网&#xff08;https://docs.flutter.cn/release/archive?tabwindows&#xff09; 或者通过 git clone -b master https://github.com/flutter/flutter.git 下载 2、配置环境…

【Redis】内存回收和内存淘汰机制

1 概念 Redis 所有的数据都是存储在内存中的, 如果不进行任何的内存回收, 那么很容易出现内存爆满的情况。因此&#xff0c;在某些情况下需要对占用的内存空间进行释放。 Redis 中内存的释放主要分为两类 Redis 中内存的释放主要分为两类: 内存回收: 将过期的 key 清除&#…

Vue77-编程式路由

一、需求 不写<router-link>实行路由的跳转。 因为<router-link>的本质是<a>&#xff0c;但是&#xff0c;有时&#xff0c;导航不一定是a标签&#xff01;或者&#xff0c;有时需要等一段时间&#xff0c;页面才跳转。 二、代码实现 三、小结

ciscn_2019_n_1

前戏--------checksec,运行查看 进入就可以发现这段代码 很浅显易懂 我们要得到的后面是 这里 我们要利用的漏洞是 get函数 0x30大小 加上8 exp: from pwn import * ghust remote("node5.buuoj.cn",28777) addr 0x4006BE payload bA * 0x30 bB*0x8 p64(addr…

上手微服务框架go-zero

文章目录 微服务框架与web框架的区别点在哪儿&#xff1f;为什么还要有微服务框架微服务框架与web框架的对比小结 为什么选go-zero&#xff1f;框架对比 下载并认识go-zero认识go-zero环境要求组成下载 实践go-zero基础功能案例apirpc服务功能说明准备构建rpc服务构建api服务服…

YIA主题侧边栏如何添加3D旋转标签云?

WordPress站点侧边栏默认的标签云排版很一般&#xff0c;而3D旋转标签云就比较酷炫了。下面boke112百科就以YIA主题为例&#xff0c;跟大家说一说如何将默认的标签云修改成3D旋转标签云&#xff0c;具体步骤如下&#xff1a; 1、点此下载3d标签云文件&#xff08;密码&#xf…

经典机器学习方法(7)—— 卷积神经网络CNN

参考&#xff1a;《动手学深度学习》第六章 卷积神经网络&#xff08;convolutional neural network&#xff0c;CNN&#xff09;是一类针对图像数据设计的神经网络&#xff0c;它充分利用了图像数据的特点&#xff0c;具有适合图像特征提取的归纳偏置&#xff0c;因而在图像相…