每天一套面试题Day20-八股高频

链接题目来自牛客 发现了一个牛客高频八股很不错

我的每日一套面试题专栏,每天更新一起打卡

1.如何创建线程池?线程池常见参数有哪些?

创建线程池可通过Java的ThreadPoolExecutor构造函数或Executors工具类实现。核心参数包括:核心线程数(维持常驻线程)、最大线程数(扩容上限)、存活时间(非核心线程空闲时长)、任务队列(存放待执行任务)、拒绝策略(队列满时的处理方式)线程工厂

2.什么是进程和线程?进程和线程的区别?

进程是操作系统中资源分配的基本单位,线程是进程中执行的基本单位,进程拥有独立的内存空间,而线程共享进程的内存空间和资源。

内存空间 进程:拥有独立的内存空间。 线程:共享进程的内存空间。 资源开销

进程:创建和切换开销大。 线程:创建和切换开销小。 通信方式

进程:通过进程间通信(IPC)进行数据交换,如管道、消息队列、共享内存。 线程:通过共享内存直接通信,速度快但需注意同步。 并发性

进程:适合多任务并发,进程间隔离性好。 线程:适合多线程并发,资源共享效率高。 Redis如何与数据库保持双写一致性

3.请你说说HashMap底层原理和扩容机制。

数组+链表 数组+链表/红黑树(JDK8以及之后,在链表长度>=8且数组长度≥64时时会变成红黑树。默认初始容量16,负载因子0.75当元素数目大于负载因子(0.75)×容量的时候,会发生扩容,扩容为原来的两倍,在jdk7之前要重新计算来确定位置,由于要么位置在原位置,要么在原位置+原数组长度,所以用哈希值与上原数组长度,如果为真,那么就在原位置+原数组长度,不然的话就不动。确定好在哈希桶的位置后,再尾插进对应的位置。

4.Redis如何与数据库保持双写一致性?

先更新数据库,后删除->读写并发,但概率不高

先删除后更新->读写并发 ->延迟双删 先更新sql后更新缓存或者先更新缓存后更新sql->写写并发

设置较短的过期时间

分布式锁(先更新数据库再更新缓存,写加锁,确保串行更新)

我的博客

5.TCP 与 UDP 的 10 大核心区别是什么?

  • 1.有连接 UDP8字节 TCP三次握手建立连接,四次挥手释放连接.TCP有连接,UDP无连接
  • 2.所以TCP只支持单播,但是UDP支持组播
  • 3.可靠(序号,ACK,超时重传,拥塞控制,流量控制)
  • 4.所以TCP可以用于准确性要求高的,如FTP,HTTP,UDP支持实时性好的。比如视频流。
  • 5.有顺序
  • 6.TCP面向字节流,UDP面向用户数据报。
  • 7.基于报文 首部20-60 首部8
  • 8.流量控制 TCP:通过滑动窗口机制动态调整发送速率,避免接收方缓冲区溢出。 UDP:无流量控制,可能因发送过快导致丢包
  • 9.TCP有拥塞控制,UDP无。慢开始,拥塞避免,快重传,快恢复
    1. 传输效率 TCP:因连接管理、重传等机制,头部开销大(20字节以上),传输效率较低。 UDP:头部仅8字节,无额外控制机制,传输效率高。

6.详细的说说Redis的数据类型

详细的说说Redis的数据类型 String 计数器 分布式锁 Set 集合交并差 共同关注 List 消息队列 ZSet 班级排名 Hash 对象

Stream 消息队列 GEO 查看附近的位置 HyperLogLog 以固定的较少内存实现不精确的去重计数,如网站UV统计 BitMap 位图,二值,签到,用户状态

7.请你说说ArrayList和LinkedList的区别。

ArrayList底层基于动态数组,因此用索引访问快,因为可以直接定位地址(基址+元素大小×索引),但是增删慢,因为可能涉及到元素的移动。 linkedlist底层基于双向链表,维护了头尾指针,因此增删快(头的),但是想要访问只能从头开始遍历,增加删除快,但是由于存储了指针,所以内存也相对占据更多。可以用来做队列和栈。 中间位置的插入删除:LinkedList只需要修改指针,ArrayList需要移动元素,(前者消耗在遍历,后者在移动),大量数据LinkedList会更快

8.说说缓存穿透、击穿、雪崩的区别。

缓存穿透大量查询原本不存在的数打到数据库,缓存空值,布隆过滤器 缓存击穿是热key失效,设置逻辑过期,互斥锁 缓存雪崩是大量缓存同时失效。随机过期时间,提高缓存可用性,比如集群

9.说说JVM的垃圾回收算法

标记-整理(老年代,无内存碎片),标记-清除(老年代,有内存碎片),标记-复制(新生代,无内存碎片)

10.进程间通信方式有哪些?

我的博客

  • 性能要求极高,数据量大:首选共享内存(但必须处理好同步问题)。
  • 简单的数据流,有亲缘关系:使用匿名管道
  • 简单的数据流,无亲缘关系:使用命名管道
  • 需要结构化的消息传递:使用消息队列
  • 需要跨网络通信或构建复杂的C/S架构:使用套接字
  • 需要通知某个事件发生:使用信号
  • 需要同步对共享资源的访问:使用信号量

12.从「敲下一个 URL」到「页面出现在屏幕」整条链路全景

DNS 主机到本地域名服务器递归查询,本地域名服务器,为了完成对客户端的递归查询承诺,向根、顶级、权限域名服务器发起查询,并接收来自它们的迭代查询响应,最终拿到域名对应的IP。

ARP协议,由目的IP得到目的MAC(路由器的MAC)

TCP三次握手建立连接

应用层:生成 HTTP 请求 传输层:TCP 分段,添加端口号 网络层:IP 封装,添加 IP 地址 数据链路层:添加 MAC 地址,形成帧 物理层:转换为比特流传输

由IP协议指路到达服务器

服务器再一层层拆开,拆到应用层,解析,响应经过HTTP应用层,TCP传输层,IP网络层,网络接口层等封装,返回客户端

浏览器解析渲染

TCP四次挥手断开连接 (连接管理:根据 HTTP 版本和头信息决定是否保持连接或关闭,现代HTTP/1.1默认长连接,可能不会立即断开)

13.如何监控并优化慢 SQL?

博客

14.为什么 MySQL 采用 B+ 树作为索引?

叶子节点双向链表,高效的范围查询,排序

叶子节点才有值,索引节点没有值,让树更矮胖,减少IO次数

#面试真题#
每日一套面试真题 文章被收录于专栏

记录刷过的面试真题

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务