Java复习-集合篇

集合

集合分为俩大类

  • 单列集合
    • 每个元素数据只包含一个值
  • 双列集合
    • 每个元素包含俩个键值对

image-20240526084729889

Conllection单列集合

单列集合常用的主要是下列几种

image-20240526085320294

List集合

List系列集合的特点:添加元素是有序、可重复、有索引

这里我们来试一下ArrayList

        ArrayList<String> list = new ArrayList<>();list.add("java1");list.add("java2");list.add("java1");list.add("java2");System.out.println(list);

image-20240526090326298

ArrayList底层原理

基于数据实现

特点:索引查询快,添加删除慢

  1. 利用无参构造器创建集合,会在底层创建一个默认长度为0的数组

    image-20240526095455113

  2. 添加第一个元素,底层会创建一个新的长度为10的素组

    image-20240526095511543

  3. 存满时,会扩容1.5倍

  4. 如果一次添加多个数据,1.5倍还放不下,则会以实际为准

应用场景

  1. 适合:根据索引查询数据,比如根据随机索引取数据,或者数据量不是很大的
  2. 不适合:数据量大的同时,又要频繁的进行增删操作

LinkedList底层原理

基于双链表实现

特点:查询慢、增删快,尤其是首尾节点速度

image-20240526100236092

应用场景

  1. 设计队列 (queue适用于校号系统、排队系统)

    image-20240526100333799

    
    /**
    * 模拟队列
    */
    LinkedList<String> queue = new LinkedList<>();//入队
    queue.addLast("第一个人");
    queue.addLast("第二个人");
    queue.addLast("第三个人");
    queue.addLast("第四个人");
    System.out.println(queue);//出队
    System.out.println(queue.removeFirst());
    System.out.println(queue.removeFirst());
    System.out.println(queue.removeFirst());
    System.out.println(queue);
    

    image-20240526101734173

  2. 设计栈(Stack)

/*
* 模拟栈
* */
LinkedList<String> stack = new LinkedList<>();
//入栈
stack.push("第一颗子弹");
stack.push("第二颗子弹");
stack.push("第三颗子弹");
stack.push("第四颗子弹");
System.out.println(stack);//出栈 
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack.pop());
System.out.println(stack);

注意这里的 push 和 pop 就是addfirst 和 removeFirst

image-20240526101539112

image-20240526101621169

Set集合

Set系列集合的特点:添加元素是无序、不可重复、无索引

注意这俩个特别:

  • LinkedHashSet:有序、不重复、无索引
  • TreeSet:按照大小默认升序排序、不重复、无索引

然后我们来试一试HashSet集合

        HashSet<String> set = new HashSet<>();set.add("java1");set.add("java2");set.add("java1");set.add("java2");System.out.println(set);

image-20240526090530065

HashSet底层原理

基于哈希表实现

特点:增删改查都较好

1.8之前

JDK8之前哈希表:数组+链表

  1. 创建一个默认为16的数组 默认加载因子为0.75表名为table

    image-20240526103135020

  2. 使用元素的哈希值数组长度求余计算出应存入的位置(这里的求余是它独有的算法,并不是我们直接的%求余,确保它为正数)

  3. 判断当前位置是否为null,如果是null直接存入

    image-20240526103332391

  4. 如果不为null,如果有元素,则调用equals方法比较(相等,则不存;不相等,则存入数组)

    1. JDK8之前,新元素会存入数组,占用老元素位置,老元素挂在下面

    image-20240526103610692

1.8之后

JDK8之后哈希表:数组+链表+红黑树

当链表长度超过8,且数组长度>=64时,自动将链表转为红黑树

image-20240526104109437

image-20240526104119591

LinkedHashSet底层原理

基于哈希表来实现

但是,每个元素都多了一个双链表机制来记录前后元素的位置

image-20240528101238298

TreeSet底层原理

特点:可排序(默认升序,按照元素大小,由小到大)

底层基于红黑树实现

总结

image-20240528102747856

集合并发修改异常错误

使用迭代器遍历集合时,又同时在删除集合中的数据,程序就会出现并发修改异常的错误。

底层原因是因为集合删除后会改变原集合的大小,而指针会自动往后移造成数据的漏删

例如

//删除名中有李字的
["张三","李四","五李","王五"]i
//第一次["张三","李四","五李","王五"]i
//删除 后指针指向五李
["张三","五李","王五"]   i//继续
["张三","五李","王五"]   i

上面这种情况就会造成异常错误

解决方法呢,就是在每次删除之后将i向前移,迭代器底层也是这样实现的

Map双列集合

每次存储需要一对数据作为一个元素

Map中的键是不允许重复的,但是值可以

HashMap底层原理

特点:无序、不重复、无索引

底层:基于哈希表实现

实际上:原来所有的Set系列的集合都是基于Map实现的,只是Set集合中的元素只要键数据,不要值数据

image-20240528165828230

image-20240528165858677

注意的是底层这里计算hash值是基于键来进行hash表计算

image-20240528170054305

LinkedHashMap底层原理

特点:有序、不重复、无索引

底层:基于哈希表实现,但是多了一个双链表机制来记录元素顺序(保证有序)

实际上:原来学习的LinkedHashSet集合的底层原理就是LinkedHashMap。

image-20240528170423776

image-20240528170511992

TreeMap底层原理

特点:不重复、无索引、可排序(按照键的大小默认升序排序,只能对键排序)

原理:跟TreeSet一样基于红黑树实现排序

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

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

相关文章

Spring OAuth2:开发者的安全盾牌!(上)

何利用Spring OAuth2构建坚不可摧的安全体系&#xff1f;如何使用 OAuth2 从跨域挑战到性能优化&#xff0c;每一个环节都为你的应用保驾护航&#xff1f; 文章目录 Spring OAuth2 详解1. 引言简述OAuth2协议的重要性Spring Framework对OAuth2的支持概述 2. 背景介绍2.1 OAuth2…

智能仓储物流系统(WMS)系列-管理查询调整

好的应用系统应是细分简单&#xff0c;界面简洁易操作&#xff0c;程序代码简洁易懂的。

史上最全排序算法整理(2)

本篇文章我们将接着上篇继续介绍常见的排序算法&#xff0c;有需要的小伙伴可以移步史上最全排序算法整理&#xff08;1&#xff09;查看相关内容哦 1.冒泡排序 1.1基本思想 在待排序的一组数中&#xff0c;将相邻的两个数进行比较&#xff0c;若前面的数比后面的数大就交换两…

gitlab 创建 ssh 和 token

文章目录 一、创建ssh key二、将密钥内容复制到gitlab三、创建token 一、创建ssh key 打开控制台cmd&#xff0c;执行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的邮箱 C:\Users\xx\.ssh 目录下会创建一个名为id_rsa.pub的文件&#xff0c;用记事本打开&#xff0c;并…

基于深度学习的中文情感分析系统python flask

基于python的毕业设计 基于深度学习的中文情感分析系统(flask)(源码说明文档演示) 毕业设计课程设计期末大作业、课程设计、高分必看&#xff0c;下载下来&#xff0c;简单部署&#xff0c;就可以使用。 包含&#xff1a;项目源码、数据库脚本、软件工具等&#xff0c;该项目…

【Spring Cloud】微服务工程中的服务注册与发现配置中心-Consul

Catalog Spring Cloud Consul一、需求二、是什么三、优点四、缺点五、怎么用六、细节 Spring Cloud Consul 一、需求 多个微服务之间通过RestTemplate中的api相互调用&#xff0c;一般要写死微服务的IP地址和端口号&#xff0c;相当于硬编码&#xff0c;非常不灵活&#xff0…

MyBatis出现:SQLSyntaxErrorException: Unknown column ‘XXX‘ in ‘field list‘

<update id"updateStudent">update tb_students set stu_name${stuName},stu_gender${stuGender},stu_age${stuAge},stu_tel${stuTel}where stu_num ${stuNum}</update> 本质上来说&#xff0c;是Mybatis使用上的错误&#xff0c;不熟悉&#xff0c;理…

SQL函数--union all 使用方法及案例

1. 使用方法 在 SQL 中&#xff0c;UNION ALL 操作用于结合两个或更多 SELECT 语句的结果集&#xff0c;包括所有匹配的行&#xff0c;甚至包括重复的行。这与 UNION 不同&#xff0c;因为 UNION 会自动删除重复的行。 满足条件&#xff1a; 1、两个select查询的列的数量必须相…

Ai速递5.29

全球AI新闻速递 1.摩尔线程与无问芯穹合作&#xff0c;实现国产 GPU 端到端 AI 大模型实训。 2.宝马工厂&#xff1a;机器狗上岗&#xff0c;可“嗅探”故障隐患。 3.ChatGPT&#xff1a;macOS 开始公测。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

企业网络的“瑞士军刀”:探索“一端多能”设备的多面性

在数字化时代&#xff0c;企业网络需求的复杂性和多样性不断增长&#xff0c;传统的单一功能网络设备已难以满足这些需求。企业需要一种集多种功能于一身的“一端多能”网络设备&#xff0c;以应对各种网络环境和业务需求&#xff0c;就像是一把多功能、灵活、可靠的瑞士军刀&a…

一个月速刷leetcodeHOT100 day13 二叉树结构 以及相关简单题

树是一种分层数据的抽象模型 二叉树 二叉树中的节点最多只能有两个子节点&#xff0c;一个是左侧子节点&#xff0c;另一个是右侧子节点 二叉搜索树 二叉搜索树&#xff08;BST&#xff09;是二叉树的一种&#xff0c;但是只允许你在左侧节点存储&#xff08;比父节点&…

测试基础07:测试工作流程规范、进度同步与把控

课程大纲 1、迭代测试流程 2、测试流程 2.1、测试用例评审 目的&#xff1a;对齐产品需求理解&#xff0c;完善、优化测试场景。 参与方&#xff1a;项目、产品、开发、测试。 用例内容&#xff1a;冒烟用例&#xff08;主流程&#xff09; 功能用例。 2.2、冒烟测试 提测…

SOLIDWORKS正版价格多少钱

SOLIDWORKS作为目前应用较为广泛的3D CAD软件之一&#xff0c;具有强大的功能和实用性&#xff0c;它为各类工程设计提供综合解决方案。但是&#xff0c;正版SOLIDWORKS价格是个不可忽视的问题。那SOLIDWORKS的正版价格究竟如何呢&#xff1f;又是受什么因素影响&#xff1f; 先…

【论文阅读|cryoET】ICE-TIDE

简介 三维cryoET重建的保真度进一步受到采集过程中物理扰动的影响。这些扰动以各种形式表现出来&#xff0c;例如连续采集之间的样本漂移&#xff0c;导致连续投影未对准&#xff0c;或者由于未散射的电子而导致二维投影中的局部变形。 传统的冷冻电子断层扫描工作流程需要对…

单片机编程的code关键字的诠释

在单片机编程中&#xff0c;code 是一个关键字&#xff0c;用于指示编译器将变量存储在程序存储器中&#xff0c;而不是在数据存储器中。通常情况下&#xff0c;程序存储器的速度比数据存储器的速度更快&#xff0c;而且程序存储器的容量较小&#xff0c;适合存储常量数据和程序…

朗读亭主要作用有哪些?

朗读亭的主要作用有以下几个方面&#xff1a; 1. 提供朗读服务&#xff1a;朗读亭是一个专门的场所&#xff0c;提供给人们朗读的环境和场地。人们可以在朗读亭中选择自己喜欢的书籍或文章&#xff0c;并通过朗读将其表达出来。这样可以帮助人们提高朗读能力&#xff0c;增强自…

2024 angstromCTF re 部分wp

Guess the Flag 附件拖入ida 比较简单&#xff0c;就一个异或 switcher 附件拖入ida 明文flag Polyomino 附件拖入ida 需要输入九个数&#xff0c;然后进入处理和判断&#xff0c;如果满足条件则进入输出flag部分&#xff0c;flag和输入有关&#xff0c;所以要理解需要满足什么…

【408真题】2009-27

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…

利用C++与Python调用千帆免费大模型,构建个性化AI对话系统

千帆大模型已于2024年4月25日正式免费&#xff0c;调用这个免费的模型以实现自己的AI对话功能&#xff0c;遵循以下步骤&#xff1a; 了解千帆大模型&#xff1a; 千帆大模型是百度智能云推出的一个平台&#xff0c;提供了一系列AI能力和工具&#xff0c;用于快速开发和应用A…

【以太网端口浪涌静电防护设计电路】

以太网端口浪涌静电防护设计电路 注&#xff1a;资料来自 深圳市浪拓电子技术有限公司 方案图 方案图 方案图 方案图 方案图 方案图 方案图 方案图 方案图 方案图