投递时间:
2024.1.2中午约面 (简单沟通能否接受上海办公)
2024.1.3下午面试
面试流程:
面试连接:牛客网
简单做下自我介绍
你的这个实习经历主要是做后端Java开发么?
略微涉及Python 主要是数据分析和策略输出
接触过Java么?
接触过一些语法基础和面向对象
问一些计算机基础吧,网络的七层模型你还有印象么?
没,物理层做一些基础硬件通信,传输层有TCP/IP
- 物理层(Physical Layer):
-
- 主要关注传输比特流,包括物理媒介、电压规范、物理连接等。
- 数据链路层(Data Link Layer):
-
- 提供数据包的传输和错误检测。这一层分为两个子层:逻辑链路控制(LLC,Logical Link Control)和介质访问控制(MAC,Media Access Control)。
- 网络层(Network Layer):
-
- 主要负责数据包的路由和转发,实现不同网络之间的通信。IP协议运作在这一层。
- 传输层(Transport Layer):
-
- 提供端到端的通信,负责数据的分段、流量控制、差错检测等。TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是在这一层工作的常见协议。
- 会话层(Session Layer):
-
- 管理会话或连接,确保数据的顺序传递。它提供对话控制和管理功能。
- 表示层(Presentation Layer):
-
- 负责数据的格式转换、加密和压缩,确保不同系统的数据能够正确解释。这一层处理数据的语法和语义问题。
- 应用层(Application Layer):
-
- 提供网络服务,为用户提供接口和网络应用。常见的协议如HTTP、FTP、SMTP等工作在这一层。
TCP协议和UDP协议的区别,讲一讲
- 连接性:
-
- TCP: 提供面向连接的服务。在数据传输之前,必须先建立连接,确保通信的双方都准备好了。数据传输完成后,需要释放连接。
- UDP: 是面向无连接的协议,通信双方之间没有建立持久的连接。每个数据包都是独立的,没有先后顺序的要求。
- 可靠性:
-
- TCP: 提供可靠的数据传输。它使用序号、确认和重传机制来确保数据的可靠性,保证数据按正确的顺序到达,并处理丢失的数据包。
- UDP: 不提供可靠性保证。数据包发送后,不会等待确认,也不会进行重传。因此,UDP更适合那些对实时性要求较高、可以容忍少量数据丢失的应用。
- 数据流控制:
-
- TCP: 提供流量控制,通过窗口大小和滑动窗口机制来防止快速发送方导致慢速接收方无法处理的情况。
- UDP: 没有流量控制机制。发送方会一直以恒定的速度发送数据,无论接收方是否能够处理。
- 头部开销:
-
- TCP: 头部较大,包含序号、确认号、窗口大小等信息,额外的功能导致了较大的开销。
- UDP: 头部较小,只包含基本的信息,因此开销较小。
- 适用场景:
-
- TCP: 适用于需要可靠数据传输、有序到达的应用,如文件传输、网页访问等。
- UDP: 适用于对实时性要求较高、能够容忍一些数据丢失的应用,如音频、视频传输、在线游戏等。
数据结构相关的话,数组链表有了解过么?
链表没有了解过么?
你觉得数组和链表有什么区别么?
- 存储方式:
-
- 数组: 使用一块连续的内存空间来存储元素。数组的元素在内存中是相邻的,通过索引可以直接访问任何元素。
- 链表: 使用节点(Node)来存储元素,每个节点包含数据和指向下一个节点的指针。链表的元素在内存中可以是不相邻的,通过指针连接起来。
- 大小固定性:
-
- 数组: 大小固定,一旦创建就不能改变。如果需要更多的空间,可能需要创建一个新的数组并将数据复制过去。
- 链表: 大小可以动态调整,可以根据需要灵活地添加或删除节点。
- 随机访问效率:
-
- 数组: 支持常数时间内的随机访问,因为可以通过索引直接访问任何元素。
- 链表: 需要从头节点开始沿着指针逐步遍历到目标位置,因此访问时间取决于元素的位置,平均情况下是O(n)。
- 插入和删除效率:
-
- 数组: 在数组中间或开头插入/删除元素需要移动其他元素,因此平均情况下是O(n)的时间复杂度。
- 链表: 在链表中插入/删除元素相对较快,只需要改变节点的指针,平均情况下是O(1)的时间复杂度。
- 空间复杂度:
-
- 数组: 通常具有较小的空间开销,因为除了存储元素本身外,不需要额外的指针。
- 链表: 需要额外的指针来存储节点之间的连接关系,因此通常具有较大的空间开销。
红黑树有了解过么?
MySQL底层是使用什么来存储?
b+树
b+树有什么特点?这个有了解过么?
- 平衡性:
-
- B+树是一种自平衡树,保持了树的平衡性,这意味着在插入或删除操作后,树会通过旋转或其他调整保持相对平衡,确保树的高度较小,从而提高检索效率。
- 多路搜索:
-
- B+树是多路搜索树,每个节点可以包含多个关键字和对应的子树。这使得B+树在一次磁盘I/O中能够查找到更多的关键字,提高了磁盘I/O的效率。
- 叶子节点顺序访问:
-
- 所有关键字都存在于B+树的叶子节点,而非内部节点。叶子节点按顺序链接,形成一个有序链表,方便范围查询和范围遍历。
- 非叶子节点不存储数据:
-
- 非叶子节点只存储关键字和指向子树的指针,不存储实际的数据。这样的设计使得每个节点能够包含更多的关键字,减小树的高度。
- 所有叶子节点都在同一层:
-
- 所有叶子节点都位于树的最底层,且通过指针链接。这个特性使得B+树更容易实现范围查询,而且能够保持叶子节点的有序性。
- 适用于外存储器:
-
- B+树的设计使得它非常适合外存储器(例如硬盘)上的索引结构,因为它能够最小化I/O操作。其平衡性和多路搜索特性使得在大规模数据集上的索引效率较高。
- 适用于范围查询:
-
- B+树的有序叶子节点链表和所有叶子节点在同一层的特性使得范围查询变得非常高效。
数据库的特性
- 数据共享:
-
- 多个用户可以同时访问数据库,并共享其中的数据。这有助于协作和数据的共同使用。
- 数据独立性:
-
- 数据库系统实现了数据和应用程序的分离,使得数据的改变不会影响应用程序的结构,反之亦然。这包括物理独立性和逻辑独立性。
- 数据一致性:
-
- 数据库确保数据的一致性,即数据在数据库中的所有副本都保持一致。在进行更新时,数据库会自动维护数据的一致性。
- 数据持久性:
-
- 数据库系统能够保持数据的持久性,即在系统故障或断电情况下,数据依然能够被恢复。
- 数据完整性:
-
- 数据库系统通过各种机制(如主键、外键、约束)来确保数据的完整性,防止不符合规定的数据被插入数据库。
- 数据安全性:
-
- 数据库系统通过身份验证、授权和加密等手段来保护数据的安全,确保只有授权用户可以访问敏感数据。
- 并发控制:
-
- 数据库系统支持多用户并发访问,通过并发控制机制来确保数据的一致性和完整性。
- 事务管理:
-
- 数据库系统支持事务,即一系列操作要么全部执行成功,要么全部失败。这确保了数据库的一致性和可靠性。
- 查询语言:
-
- 数据库系统提供查询语言(如SQL),使用户能够方便地进行数据检索、更新和管理。
- 备份和恢复:
-
- 数据库系统提供备份和恢复机制,以防止数据丢失或损坏。管理员可以定期备份数据库,并在需要时恢复数据。
- 数据模型:
-
- 数据库系统支持不同的数据模型,如关系型、面向对象、文档型等,以适应不同类型的数据和应用场景。
- 可扩展性:
-
- 数据库系统应该能够方便地扩展,以应对数据量的增加和系统负载的变化。
比如SQL可以有哪些优化?
- 合理使用索引:
-
- 确保数据库表上的列使用了合适的索引,以提高查询速度。避免在大表上使用过多或不必要的索引,因为索引的维护也会带来性能开销。
- 谨慎使用通配符:
-
- 避免在查询中使用通配符(例如 %),特别是在查询的开始处使用通配符,因为这样的查询往往无法使用索引。
- 适当使用JOIN:
-
- 使用适当的JOIN类型,并确保连接条件上有索引。避免使用不必要的JOIN操作,以减少数据集的大小。
- 使用EXISTS替代IN:
-
- 在子查询中,使用EXISTS替代IN,因为EXISTS通常比IN更高效,尤其在子查询返回大量数据时。
- *避免使用SELECT :
-
- 仅选择实际需要的列,而不是使用SELECT *,以减小返回结果集的大小,减轻数据库服务器的负担。
- 分页查询优化:
-
- 在分页查询时,使用LIMIT和OFFSET而不是在应用层获取所有数据再进行分页,以减少传输和处理的数据量。
- 使用合适的数据类型:
-
- 选择合适的数据类型,以减小表的存储空间,提高查询速度。避免在查询中对不同数据类型进行隐式转换。
- 定期统计和重建索引:
-
- 定期执行统计分析并重建索引,以确保索引的统计信息是最新的,帮助优化查询计划。
- 使用存储过程:
-
- 将一些常用的查询和操作封装成存储过程,可以提高执行效率,减少通信开销。
- 使用连接池:
-
- 对于频繁的数据库连接操作,使用连接池来避免每次都重新建立连接,提高连接的复用性和效率。
- 考虑分区表:
-
- 在大型表中,使用分区表可以减小每次查询的数据量,提高查询效率。
- 数据库服务器参数调优:
-
- 根据数据库引擎,调整数据库服务器的参数,如缓存大小、连接数等,以适应实际负载。
那你怎么知道它提升的效率怎么样?
- 执行计划分析:
-
- 查看SQL查询的执行计划,了解数据库引擎是如何执行查询的。可以使用数据库管理工具或者命令行工具来获取执行计划。观察是否使用了索引,是否有不必要的全表扫描,是否有合适的连接方式等。
- 性能测试:
-
- 在一个模拟生产环境的测试环境中进行性能测试。执行原始的SQL语句并记录性能指标,然后应用优化,并再次执行并记录性能指标。比较两次执行的性能指标,包括执行时间、CPU利用率、IO负载等。
- 使用数据库性能监控工具:
-
- 使用数据库性能监控工具来实时监测数据库的性能指标。这些工具可以提供关于查询执行时间、索引利用情况、锁定等方面的详细信息。
- Query Profiling:
-
- 使用数据库的查询分析器或分析工具来分析查询的性能瓶颈。这可以帮助识别慢查询、高消耗的查询计划和其他性能问题。
- 压力测试:
-
- 在高负载情况下进行压力测试,观察系统的响应时间和资源利用情况。通过模拟多用户同时访问数据库,可以更好地了解系统在实际负载下的表现。
- 监测变更前后的系统性能:
-
- 在应用优化之前和之后监测系统性能的变化。比较优化前后的性能指标,确保优化是有效的,并且没有引入新的性能问题。
- 使用统计信息:
-
- 数据库系统通常提供关于查询性能的统计信息。这些统计信息可以用于评估查询的相对效率,帮助决定是否需要进一步的优化。
- 反馈用户体验:
-
- 如果可能,收集用户的反馈。用户体验是一个关键指标,优化后的查询应该更快地响应用户请求。
redis你有用过吗?
没有
那spring?啊哦对,你没用过Java,算了
那我们简单来做一道题目吧,语言可切换成你熟悉的
牛客 - 中等 - 重排链表
不会,没思路
题目的意思是,第一步要找到链表的中间节点,有思路么?
没有
你有什么想阐述的么?
没
反问环节:
我想问一些问题,首先是团队的工作
美团门店相关,搜门店时有一些标签和电话的漏掉,做一些维护
学习相关:
Spring相关 + 基础技术栈
面试总结:
实习一面:基础数据结构 + 八股(计算机网络 + 数据库)