Java春招大厂面试题

文章目录

  • 软件开发2024春招大厂面试题
    • [1. redis的跳表是怎么实现的?](#1. redis的跳表是怎么实现的?)
    • [2. MVCC实现原理](#2. MVCC实现原理)
    • [3. Redis怎么实现延时消息](#3. Redis怎么实现延时消息)
    • [4. http默认端口号是多少](#4. http默认端口号是多少)
    • [5. http的几种请求(get、post...)有什么区别](#5. http的几种请求(get、post…)有什么区别)
      • [1. GET](#1. GET)
      • [2. POST](#2. POST)
    • [6. Http和Https的区别](#6. Http和Https的区别)
    • [7. tcp协议中,三次握手四次挥手是怎样的](#7. tcp协议中,三次握手四次挥手是怎样的)
      • [1. 什么是三次握手](#1. 什么是三次握手)
      • [2. 什么是四次挥手](#2. 什么是四次挥手)

该题目选自牛客 软件开发2024春招大厂面试题(1)

以下是博主的个人见解以及官方提供的答案 , 如有问题欢迎评论区交流

https://www.nowcoder.com/exam/interview/85147412/test

软件开发2024春招大厂面试题

1. redis的跳表是怎么实现的?

redis的跳表是通过多级索引实现的 , 每级索引之间的间隔为2的n次幂 , 能够通过跳表实现快速定位

正确答案:跳表(Skip List)是一种随机化数据结构,通过在有序链表的基础上增加多层索引来加快查询速度。在Redis中,跳表被用来实现有序集合(Sorted Set)数据结构。

解答思路:跳表的实现主要包括节点结构的设计、插入、删除、查找等操作。每个节点包括键、值、层数等信息,插入操作需要按照一定概率随机选择节点的层数,删除操作需要更新节点的前后指针,查找操作需要根据索引层逐层缩小范围直至到达最底层。

问题考点的深度知识讲解:跳表的实现涉及到随机化算法、链表操作、空间换时间的思想等知识点。跳表的平均查找时间复杂度为O(log n),比普通链表的O(n)更快,这得益于跳表的多层索引结构。在实际应用中,跳表能够在维护有序性的同时提高查询效率,是一种性能较好的数据结构。

希望以上解答对你有帮助,祝你面试顺利!

2. MVCC实现原理

MVCC也就是多版本迸发控制 , 也就是说通过维护一个数据的多个版本 , 来解决并发环境中出现的事务问题

MVCC机制也就是通过非阻塞读的方式提高并发环境中的读写性能 , 同时通过readview和undo_log日志实现快照读版本的选择

除此之外不同的事务隔离级别快照读的实际也不相同 , 对于读已提交每次读都会生成一个快照 , 可重复读只有第一次读的时候才会生成快照

首先在Mysql对所有表都设置了三个隐藏字段

  1. DB_TEX_ID --> 同来记录当前事务ID , 该字段是一个自增的Int , 每当事务开启后 , 就会对该ID自增
  2. DB_ROLL_TRX --> 该字段是记录上一个undo_log日志的地址
  3. DB_ROW_ID --> 当用户未指定主键时 , 该字段会作为主键

对于不同的事物隔离级别快照读的时机,对于读已提交情况在每次读取都会生成一个快照,而对于可重复读只会在第一次读的时候生成快照从而保证多次读取数据的一致性

同时对于readview,该机制是帮助快照读选取具体的版本的。在readview中保存了四个字段分别为活跃事物id,最小事物id,最大事物id,当前执行事务id。除此之外还提供了一定的规则来判断具体哪个undolog事务版本可以被采用,主要为一下几点。

  1. 如果该事务执行完毕,则运行访问,具体表现为事务版本小于最小ID;或者事务id在最大id和最小id之前且为非活跃id
  2. 如果是当前事务读,则运行访问,具体表现为,事务id等于当前事务ID
  3. 如果事务在快照读之后开启,则不允许访问,具体表现为事务id大于最大id
    undolog版本链,也就是对于所有事物在执行前需要现在undolog日志当中记录所执行数据的当前状态与上一个版本的指针地址,当多个事务完成注册就可以通过上版本的指针地址链接形成一个版本链

答案:MVCC(Multi-Version Concurrency Control)是一种数据库并发控制技术,主要用于解决读写冲突的问题,提高数据库的并发性能。MVCC的实现原理如下:

  1. 每个事务在执行过程中会生成一个唯一的事务ID,用来标识该事务的版本。
  2. 当一个事务更新数据时,不会直接覆盖原始数据,而是将新数据写入到一个新的地方,并且在新数据中记录生成该数据的事务ID。
  3. 当其他事务需要读取数据时,会根据事务ID来判断是否能够读取该数据,如果读取的事务ID小于数据生成的事务ID,则表示该数据已经被其他事务修改,需要读取其他版本的数据。
  4. 当事务提交或回滚时,会将事务ID标记为已提交或已回滚,这样可以在读取数据时过滤掉已经提交或回滚的事务版本。

MVCC的实现原理主要涉及到事务ID的生成、数据版本的保存和读取时的判断逻辑。通过MVCC可以实现非阻塞读和写,提高数据库的并发性能。

深度知识讲解:MVCC是数据库系统中常用的并发控制技术,它通过维护多个版本的数据来实现事务的并发执行。MVCC可以避免读写冲突,提高数据库的并发性能,是现代数据库系统中普遍采用的技术之一。深入理解MVCC的实现原理可以帮助我们更好地设计和优化数据库系统。

3. Redis怎么实现延时消息

redis实现延迟消息有两种方案 , 一种是通过redis的过期监听机制 , 我们可以设置一个带有过期时间的key , 然后对过期消息进行监听 , 当消息过期时发生延迟消息 . 但是由于redis的过期删除策略的删除实际是有可能导致延迟时间有误 , 同时该机制也无法保证消息不丢失 , 所以不建议使用

第二种方式就是采用zset有序集合 , 将过期时间戳作为分数 , 消息id作为订单, 然后开启轮询扫描出要发送的订单

解题思路

正确答案:Redis可以通过使用zset(有序集合)来实现延时消息功能。具体来说,可以将消息的发送时间作为score,消息内容作为value存储在zset中,然后通过轮询zset,检查当前时间是否达到消息的发送时间,来实现延时消息的投递。 解答思路:首先,将需要延时发送的消息按照发送时间加入到zset中,然后通过循环检查当前时间是否达到消息的发送时间,如果达到则将消息取出并进行处理。 问题考点的深度知识讲解:在实现延时消息功能时,需要了解Redis中zset的使用方法,以及如何根据score来进行排序和轮询。此外,还需要考虑消息的序列化和反序列化,以及如何处理消息的发送和接收过程中可能出现的异常情况。最后,还需要考虑如何保证消息的可靠性,确保消息不会丢失或重复发送。

4. http默认端口号是多少

80

正确答案:HTTP默认端口号是80。

解答思路:HTTP协议是基于TCP协议的,而TCP协议的默认端口号是80,因此HTTP的默认端口号也是80。

问题考点的深度知识讲解:在网络通信中,端口号是用来区分不同应用程序或服务的。HTTP协议是应用层协议,它使用TCP协议作为传输层协议,因此默认使用TCP协议的端口号80。当客户端发起HTTP请求时,如果不指定端口号,默认使用80端口。如果服务器端口号为80,那么客户端可以直接使用域名访问,如http://www.example.com

5. http的几种请求(get、post...)有什么区别

HTTP常见的请求有get , post , put ,delete等 , 其中get与post最为常用

1. GET

  1. GET请求通常是用来向服务器请求资源 , 其不会改变服务器状态
  2. 请求参数会通过拼接的方式拼接在url地址后面 , 不同的参数同&分割
  3. url的长度是有限制的因此 , get请求携带参数也是有限的
  4. Get请求的结果可以被浏览器缓存

2. POST

  1. POST请求通常同来作为数据传输使用
  2. 使用请求体携带参数 , 参数携带的大小不受限制
  3. 结果默认不会被浏览器保存

HTTP的请求有很多种如get , post , put ,delete等 , 其中get和post最为常见

对于get和post来说之间最大的区别是在使用上 , get请求常用来请求数据 , 而post请求常用来数据传输

除此之外get请求的请求参数会拼接在url地址后面 , 其安全性不好 , 同时参数长度是有限制的

对于get请求来说其返回值会默认被浏览器保存 ,而post不会

正确答案:HTTP的几种请求(GET、POST等)在使用时有以下区别:

  • GET:用于请求访问已被URI识别的资源,请求参数会附在URL之后,以?分割URL和参数,参数之间以&分隔,请求的数据会附在URL后面,可以被缓存,长度有限制。
  • POST:用于向服务器提交数据,请求参数会附在请求体中,不会被缓存,长度没有限制。
    解答思路:GET和POST是HTTP协议中最常用的两种请求方法,GET主要用于获取资源,而POST主要用于提交数据。GET请求的参数附在URL后面,而POST请求的参数在请求体中。GET请求可以被缓存,POST请求不会被缓存。GET请求有长度限制,而POST请求没有。
    问题考点的深度知识讲解:GET和POST是HTTP协议中的两种最基本的请求方法,了解它们的区别有助于我们更好地使用HTTP协议进行数据交互。GET请求适用于获取资源,而POST请求适用于提交数据,根据具体的需求选择合适的请求方法可以提高通信的效率和安全性。GET请求的参数直接暴露在URL中,可能会被恶意利用,而POST请求的参数在请求体中,相对安全。GET请求可以被缓存,适用于获取不经常变化的资源,而POST请求不会被缓存,适用于提交数据,保证数据的准确性和完整性。GET请求有长度限制,一般在几KB到几MB之间,而POST请求没有固定的长度限制,可以提交更大量的数据。
    综上所述,GET和POST是HTTP协议中常用的两种请求方法,了解它们的区别可以帮助我们更好地进行网络通信和数据交互。

6. Http和Https的区别

  1. 安全性: HTTP使用明文传输安全性较低 , https在数据传输之前现需要通过SSL建立链接对数据进行加密 , 其安全性优于http
  2. 端口: http默认端口为80 , https默认端口为443
  3. 资源消耗:HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电。另外,HTTPS协议还会占用更多的服务器资源。

HTTP与https最大的区别在于数据传输的安全性与传输协议上 , http采用明文传输 , 其安全性较低 , 而https在http的基础上通过SSL协议进行加密 , 数据传输更安全

正确答案:Http和Https的区别主要体现在安全性和数据传输方式上。Http是超文本传输协议,信息是明文传输,安全性较低;而Https是在Http的基础上加入了SSL/TLS协议进行加密,数据传输更加安全。

解答思路:Http和Https的区别是面试中常见的问题,需要清楚地说明两者的安全性和数据传输方式的不同。可以从协议的全称、数据传输方式、安全性等方面进行比较。

问题考点的深度知识讲解:Http是超文本传输协议,数据传输是明文的,安全性较低,容易被中间人攻击;而Https是在Http的基础上加入了SSL/TLS协议进行加密,数据传输更加安全,可以保护用户的隐私信息。Https使用了非对称加密、对称加密和摘要算法来保证数据的安全传输。Https的安全性更高,适用于需要保护用户隐私信息的场景,如网上支付、登录等。Https在数据传输过程中会增加一定的开销,但是为了保证数据的安全性是值得的。

7. tcp协议中,三次握手四次挥手是怎样的

首先三次握手四次挥手指的是在创建TCP链接与断开TCP链接的过程

1. 什么是三次握手

三次挥手的主要目的是客户端与服务端在不稳定的网络信道中建立稳定的链接

  1. 客户端向服务端发送SIN报文并指定字段的序列号 , 此时客户端处于链接等待状态
  2. 服务端接受到客户端的请求后 , 携带自己的SIN报文与ACK (ACK的值是通过客户端的序列号+1得到)返回给客户端表示愿意建立链接 , 此时处于半链接状态
  3. 客户端收到服务端信息 , 开启客户端链接 , 同时根据服务端的序列号生成ACK发送给服务端 ,服务端接受到请求开启正式的链接

2. 什么是四次挥手

关闭链接的过程可以由客户端主动关闭 , 也可以由服务端主动关闭 , 这里以客户端为例

  1. 客户端发送FIN报文并携带指定序列号给服务端 , 申请关闭TCP连接 , 同时客户端处于等待终止等待状态一
  2. 服务端接受到客户端的请求返回 , 发送给客户端ACK报文 , 此时服务端处于关闭等待状态 , 当服务端接受到客户端的确认信息处于终止等待状态二
  3. 此时如果服务端也想要关闭连接 , 就会向客户端第一次挥手那样发送FIN报文 , 此时服务端处于最后确认状态
  4. 客户端如果接受到服务端的信息 , 会向服务端发送ACK确认请求 , 并等待一段时间后关闭连接

【答案】:

正确答案:TCP协议中的三次握手是指客户端和服务器端在建立TCP连接时需要经过三次握手确认,而四次挥手是指在关闭TCP连接时需要经过四次挥手结束连接。

解答思路:三次握手是为了确保双方能够正常通信,而四次挥手则是为了确保双方都能够正常关闭连接。

问题考点的深度知识讲解:在TCP协议中,三次握手的具体流程如下:首先客户端向服务器端发送一个SYN包,表示请求建立连接;服务器收到后回复一个SYN+ACK包,表示确认请求并同意建立连接;最后客户端再发送一个ACK包,表示连接建立成功。而四次挥手的流程为:首先一方发送一个FIN包,表示要关闭连接;接收到FIN的一方回复一个ACK包,表示收到关闭请求;然后这一方会发送一个FIN包,表示自己也要关闭连接;最后对方再回复一个ACK包,表示同意关闭连接。这些过程确保了数据的可靠传输和连接的正常关闭。

相关推荐
独好紫罗兰2 分钟前
洛谷题单3-P5724 【深基4.习5】求极差 最大跨度值 最大值和最小值的差-python-流程图重构
开发语言·python·算法
MTingle5 分钟前
在线oj平台测试报告(持续更新中)
java·功能测试·selenium·java-ee·压力测试·可用性测试·模块测试
朝阳同学9 分钟前
C++中高精度运算问题
开发语言·c++
@蓝莓果粒茶14 分钟前
LeetCode第132题_分割回文串II
开发语言·算法·leetcode·职场和发展·c#·.net·linq
SimonKing15 分钟前
3ms找出微信「共同好友」,揭秘其背后的技术推手
java·redis·后端
雷渊16 分钟前
springBoot是如何实现自动配置的?
java·后端·面试
雷渊22 分钟前
深入分析BeanFactory和FactoryBean的区别
java·后端·面试
rocksun29 分钟前
使用Go降低70%的基础设施成本
java·node.js·go
多多*30 分钟前
2024第十五届蓝桥杯大赛软件赛省赛Java大学B组 报数游戏 类斐波那契循环数 分布式队列 食堂 最优分组 星际旅行 LITS游戏 拼十字
java·linux·stm32·单片机·嵌入式硬件·spring·eclipse
hmywillstronger32 分钟前
【ESP32】ESP32物联网应用:MQTT控制与状态监测
java·物联网·struts