集合List和Map

news2024/11/17 9:32:46

ArrayList底层的实现原理

 

初始化后ArrayList添加元素的步骤

首先计算数组的容量,如果当前数组已使用长度+1后的大于当前的数组长度,则调用grow方法扩容(原来的1.5倍),确保新增的数据有地方存储之后,则添加元素到size的位置上。返回添加成功布尔值。

ArrayList list=new ArrayList(10)中的list扩容几次

数组与List之间的转换

用Arrays.asList转List后,如果修改了数组内容,list受影响吗List用toArray转数组后,如果修改了List内容,数组受影响吗?

用Arrays.asList转List后,如果修改了数组内容,list会受影响,因为在集合的构造器中,数组和List集合指向同一个地址。

List用toArray转数组后,如果修改了List内容,数组不受影响,因为底层他是数组的拷贝,跟原来的元素就没关系了。

链表

单向链表和双向链表的区别

单向链表只有一个方向,结点只有后继指针next。

双向链表有两个方向,结点有后继指针next和前驱指针prev。

 

链表操作数据的时间复杂度多少

 

ArrayList和LinkedList的区别是什么

1、底层数据结构:ArrayList是动态数组实现的,更节省空间,LinkedList是双向链表实现的,更占用内存。

2、操作数据的效率:

查找效率,LinkedList的时间复杂度是O(n),对于ArrayList,给定下标的时间复杂度是O(1),下标未知的时间复杂度是O(n)。

插入删除效率,对于LinkedList,在首尾的效率为O(1),其他位置是O(n),对于ArrayList,首部的效率为O(1),其他位置是O(n)。

3、线程安全:

ArrayList和LinkedList都不是线程安全的。

有两种方法使其线程安全:

第一种:在方法内部使用,局部变量则是线程安全的。

第二种:将其转换为线程安全的集合。

 

HashMap实现原理

 

HashMap的jdk1.7和jdk1.8的区别

jdk1.7的HashMap采用数组加链表的方式。jdk1.8的HashMap采用数组加链表加红黑树的方式。当数组长度大于64并且链表长度大于8时,链表转换为红黑树。

HashMap的put方法的具体流程

  1. 首先,put方法接收两个参数:键(key)和值(value)。根据键的哈希值,确定要将键值对插入到HashMap的哪个桶(bucket)中。

  2. 如果要插入的桶为空,直接将键值对作为新的桶节点插入该位置即可。

  3. 如果要插入的桶不为空,即发生了哈希冲突,根据键的哈希值和equals方法进行比较来判断键是否已经存在于桶中。

  4. 如果存在相同的键,则更新对应键的值为新的值。

  5. 如果不存在相同的键,则将新的键值对作为桶的新节点插入到链表的头部或红黑树中。

  6. 插入完成后,如果数组长度大于64并且链表长度大于8时,链表转换为红黑树,以提高查询效率。

  7. 最后,如果插入操作导致HashMap的大小超过了负载因子(通常为0.75)乘以容量的阈值,就会触发扩容操作,重新调整HashMap的容量,以保持较低的哈希冲突率。


HashMap的扩容机制

  1. 当HashMap中存储的元素数量达到负载因子(load factor)乘以当前容量的阈值时,就会触发扩容操作。扩容时,HashMap会创建一个新的桶数组,其容量是旧数组的两倍。

  2. 接下来,HashMap会遍历原来的桶数组中的每个桶,并将桶中的元素重新分配到新的桶数组中的相应位置。重新分配的过程会根据键的哈希值重新计算桶的位置。

  3. 在重新分配元素的过程中,如果原来的桶中只有一个元素,那么该元素可以直接放入新的桶中。如果原来的桶中有多个元素,会涉及到链表或红黑树的重组操作,以保持元素在新的桶中的相对顺序。

  4. 扩容完成后,HashMap的容量就会更新为新的容量,并且新的桶数组会取代原来的桶数组成为HashMap的内部存储结构。

 

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

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

相关文章

docker环境下安装mysql 5.6

一、查看mgsql镜像版本 docker search mysql 二、拉取mysql镜像到本地标签为5.6版本 docker pull mysql:5.6 三、使用mysql5.6镜像创建容器(也叫运行镜像) 1.执行命令: docker run -p 3306:3306 --name mysql -v /haolb/mysql/conf:/etc/mysql/conf.d -v /haolb/my…

P2P、BT、ED2k、FTP、磁力链接下载到底是什么鬼?

1、HTTP/HTTPS 下载 有小伙伴会问,这个协议不是用来浏览网页的时候用的吗? 其实不然,用来下载文件一样可以,本质上都是从服务器拉取资源到本地,不同的是网页内容被渲染到浏览器上,而文件直接放在你的下载…

财富航向:企业为何急需财务管理软件?

随着市场的竞争日益激烈,企业对于财务数据的管理越来越重视。财务管理软件存在的好处越来越明显,它们可以帮助企业更好地管理财务信息并提高工作效率。 企业为什么需要财务管理软件? 1、方便管理财务数据 财务管理软件能够方便地管理与公司财…

教程学习:AutoQSAR

教程和练习文件从软件官网下载 内容: 1、拷贝教程提供的练习文件素材: 在软件的help中选择需要的教程,点击Copy to,可以将教程需要的文件拷贝到指定的文件夹里。点击Browse可以进行预览。 2、建立一个数值型的QSAR模型评估结合…

msvcr120.dll找不到是什么原因,怎样修复

msvcr120.dll的定义 msvcr120.dll是微软Visual C Redistributable软件包中的一个动态链接库文件。它是Microsoft Visual 所需的一个重要组件。这个文件主要用于支持和管理C语言编写的应用程序的运行。它包含了许多C的运行库函数和类,以便应用程序能够正常运行和调用…

2023-07-10:Kafka如何做到消息不丢失?

2023-07-10:Kafka如何做到消息不丢失? 答案2023-07-10: Kafka采用多种机制来确保消息的不丢失,其中包括副本机制、ISR(In-Sync Replicas)机制以及ACK机制等。 1.副本机制 Kafka通过副本机制来确保消息不…

【ElasticSearch】ES自动补全查询与Java接口实现

文章目录 1、安装拼音分词器2、自定义分词器3、completion suggester查询4、hotel索引库更新5、代码修改6、RestAPI实现自动补全7、需求:搜索框实现自动补全 自动补全就是当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项。 1、安装拼音分词…

“小程序化”,一种创新的超级App开发模式

超级App是一种集成了多个功能和服务的移动应用程序,它在一个平台上提供了广泛的服务和体验。超级App通常具有大量的用户群体和高度活跃的用户社区,通过提供便利、多样化的功能,吸引用户在一个应用中完成多个任务和满足多个需求。 与传统的单…

postgresql 数据库 重建索引 所需时间测试

postgresql 数据库 重建索引 所需时间测试 文章目录 postgresql 数据库 重建索引 所需时间测试前言测试前准备重建索引前数据库状态测试计划重建索引命令测试开始1.先对表2进行测试2. 表3测试3. 表1测试 🌈后记 前言 众所周知,postgresql数据库使用久了…

【业务功能篇42】ThreadPoolTaskExecutor多线程处理耗时较高的数据接口

业务场景:当前业务模块中,有个查询产品直通率接口,随着数据量的递增,百万级数据,并且需要并表的情况下,那么返回数据就会开始变慢,而在数据层方面,已经比较难去做进一步的sql优化&am…

一致性哈希算法小结

在实际生产应用中,经常会设置多台服务器共同组成一个集成对外提供服务,为了确保合理的分配来自客户端的请求,我们会采取负载均衡的策略。例如采用「轮询」的方式让每个节点都能公平的接收到请求;采用「加权轮询」的方式让硬件配置…

MySQL-MySQL分组查询每组最新的一条数据

方法一: 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘se_jck的博客-CSDN博客 这个错误是由于 MySQL 的新版本中默认开启了ONLY_FULL_GROUP_BY模式,即在 GROUP BY 语句中的 SELECT 列表中&am…

[MMDetection]测试模型

以下是基于MMdetection3.10版本 1、简单测试模型 测试模型一般使用tools中的test.py,一般使用方式 python tools/test.py config文件路径 权重文件路径 可以通过--show 来以gui展示检测结果 python tools/test.py config文件路径 权重文件路径 --show 可以通过--s…

【Linux】部署Prometheus + Grafana简介、监控及设置告警详细操作(多种方式安装,亲测无问题)

🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录 一、环境准备二、部署 Prometheus&am…

优思学院|精益管理入门书籍有哪些推荐?

精益管理是一门易学难精的学问,如果对其基本原则了解不正确,可能会误入歧途,不但不能发挥精益工具的威力,甚至会令企业走向错误的方向,反带来更多的浪费和捐失。以下将介绍几本经典的书籍,可以让你有效地、…

python简单使用【mac-ide:pycharm】

小白实用快捷键记录 一、Mac下安装并配置python3开发环境二、python学习三、pycharm常用快捷键记录 一、Mac下安装并配置python3开发环境 点我查看python及pycharm下载安装、环境配置 二、python学习 不是很推荐,想系统学习的同学可以做个参考: Pytho…

排序之玩转qsort函数——【C语言】

说起排序,我们会想起许多算法,在之前的博客中我也写到过,比如:冒泡排序法、快速排序法、选择排序法等等。其实在C语言中一直有一个可以将数组中的内容进行排序的函数且功能完善内容齐全的库函数——qsort函数。今天就让我们来探索…

OpenPCDet系列 | 8.2 nuScenes数据集的eval流程

0. eval转换的目标 模型的训练和测试过程输出结果是不一样的,对于训练过程是为了构建损失函数来进行训练,而对于测试过程是为了对object进行预测生成预测内容。下面以VoxelNeX检测器的类代码可见,training和testing将会输出两个内容。 clas…

C++数据结构笔记(7)——队列的顺序结构实现

1.队列&#xff0c;和现实生活中的规则类似&#xff0c;先进先出 2.队尾只允许元素进入&#xff0c;队头只允许元素退出 3.用数组来实现队列的顺序存储&#xff0c;无论哪一段都可以作为队头或者队尾 SeqQueue.h头文件 #ifndef SEQQUEUE_H #define SEQQUEUE_H #include<…

仿大众点评项目 —— Day02【优惠券秒杀、分布式锁】

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…