Java后端
·2025-04-19复习第十一天
什么是软中断、什么是硬中断?
软中断:软件中断,需要请求内核的服务,(网络传输、文件读取等),从用户态切换到内核态(上下文切换)
硬中断:硬件中断,网卡、硬盘、计时器等发起的中断,优先级高,却要进行上下文切换,根据中断向量,通过中断向量表,找到对应的中断处理程序进行执行。
什么是分段、什么是分页?
分段和分页都是内存管理技术
分页:页的大小是固定的,将物理内存和逻辑内存分成大小相同的页或页框,会存在内部碎片
分段:段的大小不固定,根据程序的逻辑功能进行划分(代码段、程序段、堆栈段),会出现外部碎片
段页式:先按程序的逻辑进行分段,然后再进行分页,使用(段号,页号,页内偏移量)来表示逻辑内存,通过其找到对应的物理内存。
说下你常用的 Linux 命令?
cd
ls
mkdir
cp
mv
tar -zxvf
tar -zcvf
chmod 777
ps -ef | grep java
top
kill
ipconfg
Redis 的 hash 是什么?
Redis 中跳表的实现原理是什么?
Redis Zset 的实现原理是什么?
底层是哈希表+跳表
可以用来实现排行版
哈希表:用于等值查询
跳表:用于范围查询
当元素个数小于128 且 元素大小小于64B的时候,使用压缩列表 JDK1.7后使用紧凑列表,否则使用哈希表+跳表
哈希表底层原理
将多个键值对存储在一个键中
适合存储对象,购物车等场景
底层实现
当元素个数小于512 且 元素大小小于64B的时候使用的是压缩列表或紧凑列表(JDK1.7之后),否则使用哈希表
哈希表的底层原理
在哈希表的结构体中,有一个table数组、数组大小、掩码(大小-1)和元素个数
其中table数组存储的是一个个的键值对
当发送冲突的时候使用链表解决
扩容和缩容
扩容:主要根据负载因子的情况判断,当元素个数达到所允许的负载的时候,则会继续扩容,扩容为原来的两倍
缩容:当元素的个数比较少的时候,会进行缩容,缩小为元素个数最近的那个2次幂
扩容时机:
当负载因子大于1,且此时在进行RDB生成或者AOF重写,则先不进行扩容,否则进行扩容
当负载银日大于5,无论是否继续持久化,都立即进行扩容
缩容:
负载因子小于0.1的时候
渐进式扩容
一点点的扩容
扩容的时候会使用多一个哈希表结构体,在这两个哈希表的上层,还有一个结构体引向它们,存储这哈希表数组[0]和[1],还有rehashidx,当进行渐进式扩容的时候rehashidx为一个非-1的值,表示扩容的进度
每次增删改查的时候,将一部分的数据移动到新的数组中去
新增加的数据直接添加到新数组中
最终完成渐进式哈希的时候,将rehashidx设置为-1,表示扩容完毕。
跳表:
有多条链表,越往上的链表存储的元素个数越少,
查找流程:从最上层的链表开始查找,如果能从当前链表中直接找到,则返回,如果找不到则确定一个区间,进入下一层继续查找,直到来到最后一层的链表,最后一层的链表是包含所有元素,找到则返回,找不到说明元素不存在。
插入流程:从最上层的链表开始查找,确定插入的区间(每一层都记录区间的左节点),进入下一层继续查找,直到来到最后一层的链表,找到插入的位置,此时通过摇塞子的形式,判断当前插入元素会横跨多少层,此时上面记录区间的左节点就有用了,可以方便在多层进行插入。
★学习紧凑列表和压缩列表的思想
压缩列表
* 记录节点数目
* 记录占用空间大小
* 记录尾节点的距离开始节点的偏移量(辅助倒序遍历)
* 列表节点(每个节点会存储上一个节点的长度信息1字节~5字节,这里是级联更新的关键)
紧凑列表(和紧凑列表类似)
* 记录节点数目
* 记录占用空间大小
* ❌不需要记录尾节点的距离开始节点的偏移量(也就是不支持倒序遍历)
* 列表节点(只存储自身的节点长度信息,且放在尾部)
问题:哈希表和HashMap有什么区别
3
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
