当前位置: 首页 > news >正文

秋招突击——8、20——知识补充——Java容器

文章目录

    • 引言
    • 正文
      • 总览
        • ArrayList
        • LinkedList
        • Queue & Stack & ArrayDeque
        • PriorityQueue![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/acdc7f306a2e4052bc6bc14a175e67fc.png)
        • HashSet & HashMap
        • LinkedHashSet & LinkedHashMap
        • TreeSet & TreeMap
      • 面试题
        • 计算HashCode,为什么要将hashCode中的高16位和低位按位异或?
        • HashCode中获取桶的位置时?使用什么方法来计算桶的下标?
        • 遍历集合过程中回删除元素吗?怎么处理?
        • HashMap冲突的时候,为什么用红黑树?不用平衡树?
        • 1000亿的数据,无限制内存,插入到HashMap中,怎么快速完全地插入?
        • 为什么在Java中如果要使用一个栈或者队列,为什么优先选择ArrayDeque,而不是LinkedList
    • 总结

引言

  • 之前虽然看过了容器相关的一些知识,但是不够全面,今天完整地过一遍。
  • 资料来源

正文

总览

在这里插入图片描述

  • 如上图,容器主要分为两类Map和Collection,这两个都是接口,下面是具体的实现类,然后重要的主要分为两类

  • Map

    • 最基本HashMapLinkedHashMap
    • 具备排序和范围查找的SortedMap=》NavigableMap接口的实现类TreeMap
  • Collection

    • List
      • LinkedList
      • ArrayList
    • Queue
      • 常规实现类
        • LinkedList
        • PriorityQueue
      • Deque
        • LinkedList
        • ArrayDeque
    • Set
      • 常规实现类:
        • HashSet
        • LinkedHashSet
      • SortedSet
        • NavigableSet
          • 具体实现类,TreeSet

下面将重点讲解其中的几个部门内容

ArrayList

在这里插入图片描述
特点

  • 使用动态数组实现,自动扩容1.5倍
  • 非线程安全类,与之类似的vector是线程安全的

注意

  • 为了避免在使用中因为扩容,增加时间开销,需要提前估计数据容量,创建ArrayList给初始值
    • 或者提前手动扩容ensureCapacity
  • 不是C++中的vector,使用add添加元素和插入元素,没有push_back和insert

常见的方法

  • set(index,element):修改特定索引位置的方法
  • get(index):获取特定索引位置的方法
  • remove(index)\(element):删除特定索引位置或者删除第一个满足要求元素
  • indexOf:返回元素第一次出现的位置
LinkedList

底层:双向链表
在这里插入图片描述
特点

  • 实现了List接口Queue接口Deque接口
  • 非线程安全的,需要使用Collections.synchronizedList进行包装

常规方法
Queue方法

  • 查看队首元素peek
  • 弹出队首元素poll
  • 元素入队offer

Deque方法

  • 添加元素offer
    • offerLast
    • offerFirst
  • 删除元素poll
    • pollFirst
    • pollLast
  • 查看元素peek
    • peekFirst
    • peekLast

模拟Stack

  • 添加元素push
  • 删除元素pop

注意

  • 有的时候需要操作一个特殊的队列,又能中间删除,又能模拟队列的结构,可以声明LinkedList对象
Queue & Stack & ArrayDeque

关于Queue和Stack

  • Java中实现Queue功能和Stack功能,推荐使用ArrayDeque,然后再是LinkedList

ArrayDeque

在这里插入图片描述

特点

  • 底层使用循环数组实现,不允许存放null元素
  • 非线程安全的,需要实现同步机制实现
  • 容量肯定是2的倍数

考点

  • 1、下表越界判定
    • head = (head - 1) & (elements.length - 1)
    • 这段代码实现取余操作
  • 2、扩容方式
    • 空间问题是插入之后解决的,tail和head都是指向下一个可插入的位置
    • head和tail相等的时候,进行扩容,直接扩容两倍
    • 先左后右
PriorityQueue在这里插入图片描述

特点

  • 保证每次取出的队列是最小的或者是最大的
  • 底层使用通过完全二叉树实现的小顶堆实现,实际上还是使用数组实现的
  • 添加元素和删除元素的时间复杂度都是logN

添加元素的过程

  • 添加元素要重新调整树的结构,默认是添加在数组的尾部
  • 自下而上进行调整,不断和父节点进行比较,不满足条件进行交换
    在这里插入图片描述

删除元素

  • 默认是弹出数组的首元素,然后将数组的最后一个元素重新放置到队首,重新进行调整
  • 调整方式
    • 从k指定的位置开始,将x逐层向下与当前节点的左右孩子中较小的那个交换,直到x小于或等于左右孩子中的任意一个位置

在这里插入图片描述

HashSet & HashMap

HashMap和HashSet实现是相同的,都是基于HashMap,HashSet采用的是适配器模式实现的
在这里插入图片描述
特点

  • 非线程安全的,需要使用同步机制实现线程安全的
  • 不保证元素顺序,会对元素进行重排,TreeSet保证顺序
  • 使用红黑树和拉链法解决Hash冲突

扩容相关

  • 决定因素:初始容量Capacity负载系数load factor
  • entry数量超过 capacity * loadFactor的时候,会进行扩容的
  • 对于插入元素较多的场景,需要初始化一个合适的容量,防止扩容

equals和hashcode的关联

  • 通过hashcode决定当前记录属于那个桶 bucket
  • 逐个比价equals决定,是否为目标记录

查找元素的基本流程

  • 计算索引坐标的方式
    • hash(k)&(table.length-1)等价于hash(k)%table.length,使用按位与的操作,来提高运行速度
      • table.length-1二进制的高位全部是0,低位全部是1,通过按位与的方式,实现取余数的操作
        在这里插入图片描述

插入元素的基本操作

  • 首先会做一次基本的查找,如果查找到该元素,就直接返回
  • 如果没有查到该元素,插入新的Entry
    在这里插入图片描述

Java8的HashMap结构

在这里插入图片描述

  • 针对hash冲突,采用拉链法和红黑树进行处理,记住采用尾插法

    • 如果元素数量超过了8,将链表转为红黑树,node转为treenode
    • 如果元素数量小于8,采用链表解决hash冲突的问题
  • 特点

    • 扩容每次都是两倍,所以容量肯定是2的倍数
    • 获取数据过程
      • 首先,判定当前key的hash值,根据hash值和容量 - 1 的按位与,找到数组对应的下标
      • 判断数组所处的位置是否有多个元素,是否是我们需要找的元素
        • 存在多个元素,先查看是不是treeNode结构,红黑树需要查找
        • 不是红黑树,需要对链表进行遍历查找
LinkedHashSet & LinkedHashMap

LinkedHashSet里面是对LinkedHashMap的一个适配器
在这里插入图片描述

特点

  • 在HashMap的基础上,采用双向链表的形式,将所有entry连接起来,保证元素的迭代顺序和插入顺序相同
    • 迭代顺序和插入顺序相同
TreeSet & TreeMap
  • TreeSet同样的也是TreeMap的套壳
    在这里插入图片描述

TreeMap
特点

  • 底层通过红黑树实现,时间复杂度是logN
  • 非线程安全的,需要通过同步器包裹Collections.synchronizedSortedMap(new TreeMap)

红黑树的定义

  • 每一个节点要么是红色,要么是黑色
  • 根节点必须是黑色
  • 红色节点不能连续,父亲节点和孩子节点不能同时是红色
  • 对于每一个节点,从该点到null的任何路径,都含有相同个数的黑色节点
    • 每一次插入和删除操作都需要重新调整二叉树才行。

面试题

计算HashCode,为什么要将hashCode中的高16位和低位按位异或?
  • 混合高低位,增加随机性
    • 将高位和低位进行异或时,能够更好地混合二进制表示中的位,使得散列之后的值更加随机化
    • 有助于哈希表中均匀分布哈希值,避免不同的键因为高位相同发生哈希冲突
  • 降低低位的影响
    • 因为并没有完全用到计算出来的哈希吗,仅仅是使用了某些低位,通过高低位异或混合,将高位的影响传递到低位
  • 减少相似的哈希码
    在这里插入图片描述
HashCode中获取桶的位置时?使用什么方法来计算桶的下标?
  • 用与的操作来替换取模操作,提高运算速度。使用HashCode来计算桶的下标
    在这里插入图片描述
遍历集合过程中回删除元素吗?怎么处理?
  • 使用迭代器遍历的时候,删除元素,会报错
  • 必须要使用遍历器自带的remove方法可以
HashMap冲突的时候,为什么用红黑树?不用平衡树?
  • 解决了普通树的退化问题
  • 不需要频繁调整对应进行调整
1000亿的数据,无限制内存,插入到HashMap中,怎么快速完全地插入?
  • 核心
    • 要解决put方法插入慢的关键点
  • 预支内存,提前估计内存大概多大,然后提前分配内存,然后避免不断扩容。
  • 任务做一个划分,四个线程分别负责不同的块进行桶的操作
为什么在Java中如果要使用一个栈或者队列,为什么优先选择ArrayDeque,而不是LinkedList
  • 内存开销
    • ArrayDeque的内存开销较小,仅仅保存数据和额外扩容的空间
    • LinkedList需要保存额外的两个指针,来增加内存消耗
  • 内存布局和局部性
    • ArrayDeque是一个动态扩展的数据,元素是连续存在的,遍历和访问元素,能够更好地利用CPU缓存
    • LinkedList内存不连续,缓存命中率低,然后性能较差
  • 时间复杂度
    • 添加元素的话,ArrayDeque是O(1),虽然LinkedList但是操作更加复杂

总结

  • 又算是草草结束了,想着明天腾讯三面了,我得去看看场景题,感觉很多时候,都会考场景题!
  • 这个算是有了一个大概的了解,而且很多细节也做了深究,但是始终感觉不够全面!

相关文章:

秋招突击——8、20——知识补充——Java容器

文章目录 引言正文总览ArrayListLinkedListQueue & Stack & ArrayDequePriorityQueue![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/acdc7f306a2e4052bc6bc14a175e67fc.png)HashSet & HashMapLinkedHashSet & LinkedHashMapTreeSet & TreeMap 面…...

IOS 06 OC调用Swift第三方框架

前面文章05讲的是在OC项目中,调用Swift代码,而在真实开发过程中,在OC项目中调用Swift第三方框架场景用的是非常多的,所以我们也了解在OC项目如何使用Swift写的三方框架。 实现流程: 1、OCUseSwiftTest;在…...

SAP和致远OA系统集成案例

一、项目介绍 重庆某控股(集团)有限公司是一家集合汽柴油动力及终端、摩托车、储能电源、汽车零部件、金融服务等产业的多元化集团公司,业务遍布全球80多个国家及地区,2021年营业收入达80亿元。 为推动集团信息化、数字化转型…...

19 OptionMenu 组件

OptionMenu 组件使用指南 Tkinter 的 OptionMenu 组件是一个下拉选择框,允许用户从一组预定义的选项中选择一个。它通常用于提供用户一个有限的选项集合来选择。以下是对 OptionMenu 组件的详细说明和一个使用案例。 OptionMenu 组件属性 variable: 与 OptionMen…...

【C语言】字符函数与字符串函数(上)

字符函数与字符串函数(上) 文章目录 字符函数与字符串函数(上)1.字符分类函数2.字符转换函数3.strlen的使用和模拟实现3.1使用示例:3.2模拟实现 4.strcpy的使用和模拟实现4.1使用示例:4.2模拟实现 5.strcat的使用和模拟…...

机器学习系列—深入探索弗里德曼检验:非参数统计分析的利器

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…...

【ubutnu18.04】k8s 部署4: worker节点配置1.31.0和containerd 1.7.20

上一篇:【ubutnu24.04】k8s部署3:重新安装1.31.0并init成功 worker 节点之一是ubuntu18.04主要参考 How Install Kubernetes on Ubuntu 24.04 (Step-by-Step Guide) 重点参考 ubuntu24.04 作为master反复配置kubelet root@PerfSvr:/home/zhangbin/perfwork/k8sadmin# sudo kub…...

android kotlin集成WorkManager实现定时获取数据

在Android中使用Kotlin集成WorkManager来实现定时获取数据是一个很常见的需求。WorkManager可以帮助你在设备处于闲置或应用被关闭时执行后台任务,特别适用于需要在特定时间间隔内重复执行的任务。以下是实现步骤: 1. 添加依赖项 首先,在你…...

BvSP_ Broad-view Soft Prompting for Few-Shot Aspect Sentiment Quad Prediction

BvSP: Broad-view Soft Prompting for Few-Shot Aspect Sentiment Quad Prediction 英文题目BvSP: Broad-view Soft Prompting for Few-Shot Aspect Sentiment Quad Prediction中文题目BvSP:面向少样本方面情感四元预测的广视角软提示论文地址aclanthology.org/202…...

React+Vis.js(05):vis.js的节点的点击事件

文章目录 需求实现思路抽屉实现完整代码需求 双击节点,弹出右侧的“抽屉”,显示节点的详细信息 实现思路 vis.network提供了一个doubleClick事件,代码如下: network.on(doubleClick, function (properties) {// console.log(nodes);let id = properties...

今日(2024 年 8 月 19 日)科技新闻

科大讯飞推出星火极速超拟人交互:8 月 19 日,科大讯飞宣布星火语音大模型更新,正式推出星火极速超拟人交互,并将其能力落地在讯飞星火 APP “小星畅聊” 功能中。该交互响应速度更快,能感知用户情绪变化并共情回应&…...

Python 虚拟环境

为什么要创建虚拟环境 创建 Python 虚拟环境的主要目的是为了解决依赖管理的问题,特别是在开发多个项目或部署应用程序时,虚拟环境具有以下几个优势: 依赖隔离: 不同的项目可能需要不同版本的 Python 解释器和库。通过创建虚拟环…...

Redis RDB三两事

rdb:将数据库的快照以二进制格式保存在文件中,redis重启后直接加载数据。可以通过save和bgsave命令生成rdb。当然我们可以在生成rdb文件时指定规则,例如 save 60 1000 如果60秒内不少于1000个key发生了改动,则生成一个新的rdb文件…...

分布式高可用架构设计

一、限流 1、单机限流 如图,应用C的资源c/x被上游的应用A和应用C并发访问,应用C的系统能力支持c/x资源最高5000/qps的访问量;为了不让高并发流量或尖峰流量压垮应用C,可以针对应用C的资源c/x做限流;比如设置限流4500…...

GATK SampleList接口介绍

在 GATK 中,SampleList 是一个接口,用于表示一个样本列表。这些样本通常是在基因组分析过程中被处理的不同生物样本。SampleList 接口提供了访问这些样本的一些基本方法,通常用于多样本分析任务,比如变异检测或基因组重测序。 SampleList 接口的方法 SampleList 接口定义…...

00后是真卷不过,工作没两年,跳槽到我们公司起薪20K都快接近我了

在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&…...

树莓派Pico C/C++ 开发环境搭建(一键完成版)

树莓派Pico C/C 开发环境搭建(一键完成版) 因为之前使用过MicroPython开发过树莓派Pico,总觉得用起来怪怪的。正好最近树莓怕发布了新一代的MCU——RP2350,之前的RP2040在各个平台都有所降价,因此,买了几块。同时因为之前是玩stm…...

【计算机组成原理】二、数据的表示和运算:1.数值与编码(十进制二进制转换、BCD码、ASCII码、汉字编码、奇偶校验码、循环冗余检测CRC、海明码)

二、数据的表示和运算 文章目录 二、数据的表示和运算1.数值与编码1.1数据存储和排列❗1.2十进制转换1.2.1整数1.2.2小数 1.3二进制转换1.3.1 B->O1.3.2 B->H 1.4真值&机器数1.5 BCD码1.6 ASCII码1.7汉字与GBK1.8 UTF1.9检错码1.9.1奇偶校验码1.9.2循环冗余检测CRC1.…...

汇编语言中的艺术:数据压缩与解压缩技术

标题:汇编语言中的艺术:数据压缩与解压缩技术 数据压缩是计算机科学中的一项基本技术,它通过减少数据的冗余来降低存储或传输所需的空间。在低级语言如汇编语言中实现数据压缩和解压缩,不仅是一种技术挑战,也是对硬件…...

【Alibaba Cola 状态机】重点解析以及实践案例

【Alibaba Cola 状态机】重点解析以及实践案例 1. 状态模式 状态模式是一种行为型设计模式,允许对象在内部状态改变时改变其行为,简单地讲就是,一个拥有状态的context对象,在不同状态下,其行为会发生改变。看起来是改…...

购买商城源码前需要考虑哪些方面?

前言 购买商城源码前需要考虑的方面包括功能满足、技术兼容性、可扩展性、公司实力、客户评价、安全性与稳定性等。 购买商城源码是一项重要决策,需要综合考虑多个因素。以下是详细的考虑方面: 1.功能满足: 确保所选的源码能够支持企业所…...

MongoDB快速入门CRUD

1. 数据库管理 1.1 切换数据库 切换到名为 myDatabase 的数据库。如果该数据库不存在,MongoDB 会在第一次写入数据时自动创建它。 use myDatabase;1.2 查看当前数据库 显示当前使用的数据库的名称。 db; 1.3 显示所有数据库 列出当前 MongoDB 实例中的所有数…...

【python基础】—利用pandas读取或写入mysql表数据

文章目录 一、read_sql()二、to_sql()三、连接数据库方式—MySQL1、用sqlalchemy包构建数据库链接2、用DBAPI构建数据库链接 四、容易遇到的问题 一、read_sql() 功能 将 SQL 查询/数据库表读入 DataFrame。 语法 读取数据库(通过SQL语句或表名) pand…...

C/C++信号量

文章目录 一、信号量介绍1.1 什么是信号量1.2 信号量的原子性1.3 信号量的使用 二、C语言使用2.1 函数接口2.2 信号量代码 三、C20使用3.1 函数接口 四、C11模拟信号量 一、信号量介绍 1.1 什么是信号量 信号量是一种特殊的变量,是操作系统层面的,可以…...

SSL Pining 问题解决方案

实战案例 为了能够更好的复现 SSL Pining 场景,我们对一个 App(https:app4.scrape.center)进行抓包,这个 App 包含了 SSL Pining 的相关设置,如果我们将手机的代理设置为抓包软件提供的代理服务,那么这个 …...

【Spring Boot】全局异常处理

目录 背景 前言 设计步骤 1.定义异常信息类: 2.自定义异常: 3.创建全局异常处理类 4.在控制器中抛出异常 5.输出 捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中,如何处理全局异常的,也就是如何捕获全局异…...

安全基础学习-SM3加密算法

SM3是一种广泛使用在中国国家标准中的哈希算法,全称为“中国国家密码算法SM3”。它由中国国家密码管理局制定,主要用于数字签名和消息完整性验证。SM3算法与SHA-256在结构上类似,但其设计具有特定的改进以增强安全性。 SM3算法生成256位的哈希值,使用了32轮的迭代运算,并…...

MySQL中处理JSON数据:大数据分析的新方向

1. 简介 1.1. 概述 在MySQL中处理JSON数据的能力是在MySQL 5.7版本中引入的,并在后续的版本中不断得到增强。这使得MySQL能够直接操作和查询JSON格式的数据,极大地扩展了其处理复杂数据结构的能力。 1.2. 主要特点 灵活性与可扩展性 :JSON允许开发者存储不规则和嵌套的数…...

K8S 容器调度

在Kubernetes中,容器调度是一个自动化的过程,负责将容器(在Kubernetes中称为Pod)分配到集群中的合适节点上运行。这一过程由Kubernetes的调度器(kube-scheduler)控制,它通过一系列算法和策略来确…...

C++ //练习 17.2 定义一个tuple,保存一个string、一个vector<string>和一个pair<string, int>。

C Primer&#xff08;第5版&#xff09; 练习 17.2 练习 17.2 定义一个tuple&#xff0c;保存一个string、一个vector和一个pair<string, int>。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************…...