【面经】美团一面面经分享

一 简单介绍一下链表、栈、二叉树,想想它们会在什么情况下用到?

1. 链表(Linked List)

        链表是一种线性数据结构,由一系列节点(Node)组成。每个节点包含数据部分和指向下一个节点的指针(或引用)。链表的主要类型包括单链表、双链表和循环链表。

  • 动态数据存储:在不知道数据数量的情况下,需要动态地插入和删除数据。
  • 实现栈和队列:链表可以很自然地实现栈(后进先出)和队列(先进先出)。
  • 导航系统:如浏览器的前进和后退功能,可以使用双链表来实现历史记录。
  • 内存管理:动态分配内存和管理内存碎片,例如操作系统中的空闲内存列表。

2. 栈(Stack)

        栈是一种线性数据结构,遵循“后进先出”(LIFO, Last In First Out)原则。栈只允许在一端进行插入和删除操作,这一端被称为栈顶。

  • 递归调用:程序的调用栈用于保存函数调用的上下文信息。
  • 表达式求值:如中缀表达式转换为后缀表达式(逆波兰表达式)和求值。
  • 撤销操作:如文本编辑器的撤销操作,栈可以用于记录操作历史。
  • 括号匹配:验证程序中的括号是否配对,栈可以帮助解决这个问题。

3. 二叉树(Binary Tree)

        二叉树是一种树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的主要类型包括普通二叉树、二叉搜索树(BST)、平衡二叉树(如 AVL 树和红黑树)等。

  • 数据存储:如数据库索引的实现,特别是二叉搜索树用于快速查找、插入和删除操作。
  • 表达式树:用于计算和优化表达式,例如计算数学表达式的值。
  • 文件系统:某些文件系统使用树形结构来组织文件和目录。
  • 编译器:用于解析和生成语法树,以支持代码的编译和执行。

二 b+树是什么

        B+ 树是一种自平衡的树数据结构,广泛用于数据库和文件系统中,以实现高效的检索、插入、删除和范围查询。B+ 树是一种多路搜索树的变种,具备以下特点:

        所有的值都存在叶子节点中,非叶子节点只存储指向子节点的索引。

        叶子节点通过链表相连,方便范围查询。

        所有叶子节点都在同一层级,保证了平衡性。

三 数据库隔离级别

隔离级别脏读不可重复读幻读
读未提交允许允许允许
读已提交不允许允许允许
可重复读不允许不允许允许
串行化不允许不允许不允许

1.读未提交(Read Uncommitted)

        在此隔离级别下,事务可以读取其他事务未提交的数据。这是最宽松的隔离级别,允许“脏读”。

问题

  • 脏读:一个事务读取到其他事务尚未提交的数据。如果后续事务回滚,之前读取的数据将不存在,从而导致数据不一致。
  • 不可重复读:同一事务中的两次读取可能得到不同的数据。
  • 幻读:事务在读取某范围的数据时,其他事务可能在此范围内插入新数据。

        适用场景:当事务对数据的一致性要求较低,性能优先时(如一些日志系统或统计系统)。 

2. 读已提交(Read Committed)

        在此隔离级别下,事务只能读取其他事务已经提交的数据。这避免了“脏读”问题,但仍然可能出现“不可重复读”和“幻读”。

问题

  • 不可重复读:在一个事务中多次读取相同数据时,读取结果可能不同。
  • 幻读:事务读取的范围内的数据可能因为其他事务的插入而发生变化。

        适用场景:大多数系统使用此级别,它提供了相对平衡的数据一致性和系统性能。

3. 可重复读(Repeatable Read)

        在此隔离级别下,事务中的所有读操作都只能读取事务开始时的快照数据,保证了“不可重复读”的问题得到解决,但仍可能出现“幻读”。

问题

  • 幻读:尽管保证了读操作的一致性,但其他事务插入的新数据仍可能影响事务的结果。

        适用场景:需要确保事务中的读操作一致性,但对“幻读”不敏感的应用场景(如一些财务系统)。

4. 串行化(Serializable)

        在此隔离级别下,事务完全隔离,系统仿佛是串行执行的,即每次只有一个事务在运行。此级别避免了所有的并发问题,包括“脏读”、“不可重复读”和“幻读”。

问题

  • 性能开销:由于完全隔离,可能会显著降低并发性能,导致事务等待和阻塞。

        适用场景:对数据一致性要求极高的应用场景(如银行转账),通常不推荐在负载较高的系统中使用。

四 SpringBoot为什么能直接启动

        Spring Boot 能够直接启动的核心原因是它通过自动配置、嵌入式服务器、简化的主应用程序入口和内置的配置约定,消除了繁琐的配置步骤。通过使用主应用程序入口点和预配置的“starter”模块,Spring Boot 将复杂的配置隐藏在内部,使开发人员能够专注于业务逻辑,而不是基础设施配置。这种方式大大提高了开发效率并简化了应用程序的部署。

五 谈谈IOC

        IOC就是控制反转,通俗的说就是我们不用自己创建实例对象,这些都交给Spring的bean工厂帮我们创建管理。这也是Spring的核心思想,通过面向接口编程的方式来是实现对业务组件的动态依赖。这就意味着IOC是Spring针对解决程序耦合而存在的。在实际应用中,Spring通过配置文件(xml或者properties)指定需要实例化的java类(类名的完整字符串),包括这些java类的一组初始化值,通过加载读取配置文件,用Spring提供的方法(getBean())就可以获取到我们想要的根据指定配置进行初始化的实例对象。

        IOC或依赖注入减少了应用程序的代码量。它使得应用程序的测试很简单,因为在单元测试中不再需要单例或JNDI查找机制。简单的实现以及较少的干扰机制使得松耦合得以实现。IOC容器支持勤性单例及延迟加载服务。

六 三次握手

        第一次握手:客户端请求建立连接,向服务端发送一个同步报文(SYN=1),同时选择一个随机数 seq = x 作为初始序列号,并进入SYN_SENT状态,等待服务器确认。

        第二次握手:服务端收到连接请求报文后,如果同意建立连接,则向客户端发送同步确认报文(SYN=1,ACK=1),确认号为 ack = x + 1,同时选择一个随机数 seq = y 作为初始序列号,此时服务器进入SYN_RECV状态。

        第三次握手:客户端收到服务端的确认后,向服务端发送一个确认报文(ACK=1),确认号为 ack = y + 1,序列号为 seq = x + 1,客户端和服务器进入ESTABLISHED状态,完成三次握手。

七 TCP和UDP的区别

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
是否有序无序有序,消息在传输过程中可能会乱序,TCP 会重新排序
传输速度
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字节,最大60字节
适用场景适用于实时应用(IP电话、视频会议、直播等)适用于要求可靠传输的应用,例如文件传输
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值