查看原文
其他

再战美团!

小林coding 小林coding 2024-01-01

大家好,我是小林。

分享一位读者面试美团 java 岗位的面经。主要在考察 java+mysql

算法题

最长回文串
根据前序中序恢复二叉树

说说MySQL的索引

回答:

  • (1)根据数据结构分类:B+树索引,Hash索引,全文索引;Hash索引O(1)查找,B+树是O(log n)查找,B+树支持范围查找。
  • (2)根据存储分类:聚集索引和非聚集索引

说说事务,什么是ACID,什么是一致性

回答:

  • 原子性,一致性,隔离性和持久性,一致性指的是事务前和事务后数据满足完整性约束

补充:

MySQL 事务有 ACID 四大特性,分别是原子性、隔离性、持久性、一致性。

  • 首先原子性,意思是事务要么全部完成,要么全部不完成,原子性是由 undo log 日志保证的;
  • 接着隔离性,意思是防止多个事务并发读写同一个数据的时候,导致数据不一致问题的发生,隔离性是由 MVCC 和锁保证的;
  • 然后持久性,意思是保证事务完成后对数据的修改就是永久的,不会因为系统故障而丢失,持久性是由 redo log 日志保证的;
  • 最后一致性,意思是事务执行前后,数据库的状态必须保持一致性,一致性是由通过持久性+原子性+隔离性这三个共同保证的;

说说分布式事务的一致性

回答:分布式事务中各个参与者要么都执行,要么都不执行(这里其实讲的是原子性)

追问:你讲的偏向原子性,还有跟时间顺序和先后顺序相关的一致性

追问:项目中用过分布式事务吗

回答:没有

说说Redis的底层数据结构

回答:String,List,Set,ZSet

追问:ZSet底层数据结构

回答:ListPack或跳表加哈希表

追问:还了解其他底层数据结构吗

回答:链表相关,ZipList,QuickList;Hash表相关

Spring bean和application的生命周期,项目中用过那些钩子吗

回答:首先注册bean到IOC容器

追问:bean有几种注入方式

回答:根据构造器进行注入,根据set方法进行注入

追问:假如有多个对象互相依赖怎么处理

回答:。。。

追问:他底层用的是多个map,将不同状态的对象缓存起来,比如半装载,完全装载对象

补充:

Spring 中设计了三级缓存来解决循环依赖问题,当我们去调用 getBean()方法 的时候,Spring 会先从一级缓存中去找到目标 Bean,如果发现一级缓存中没有 便会去二级缓存中去找,而如果一、二级缓存中都没有找到,意味着该目标 Bean 还没有实例化。于是,Spring 容器会实例化目标 Bean(PS:刚初始化的 Bean 称为早期 Bean) 。

然后,将目标 Bean 放入到二级缓存中,同时,加上标记是 否存在循环依赖。如果不存在循环依赖便会将目标 Bean 存入到二级缓存,否则, 便会标记该 Bean 存在循环依赖,然后将等待下一次轮询赋值,也就是解析 @Autowired 注解。等@Autowired 注解赋值完成后,会将目标 Bean 存入到一 级缓存。Spring 一级缓存中存放所有的成熟 Bean,二级缓存中存放所有的早期 Bean, 先取一级缓存,再去二级缓存。

java中线程状态有哪些

回答:创建,就绪,运行,等待,结束

补充:

  1. NEW:表示线程已经被创建,但是还没有开始执行。

  2. RUNNABLE:表示线程正在Java虚拟机中执行,但是它可能正在等待操作系统分配CPU时间片。

  3. BLOCKED:表示线程正在等待锁,以便进入同步块或方法。

  4. WAITING:表示线程正在等待另一个线程执行特定的操作,例如调用Thread.sleep()方法或等待I/O操作完成。

  5. TIMED_WAITING:类似于WAITING状态,但是线程在等待一段时间后会自动返回RUNNABLE状态,例如调用Thread.sleep(long millis)方法。

  6. TERMINATED:表示线程已经执行完毕,已经退出了。

讲一下JVM内存结构

回答:元数据区,堆区,栈

追问:jdk1.7和1.8的区别了解吗

回答:1.7使用永久代,1.8替换为元数据区,并把常量池放入了堆区

补充:

在 1.7 版本里面,永久代内存是有上限的,虽然我们可以通过参数来设置,但是 JVM 加载的 class 总数、大小是很难确定的。所以很容易出现 OOM 问题。但是元空间是存储在本地内存里面,内存上限比较大,可以很好的避免这个问题。永久代的对象是通过 FullGC 进行垃圾收集,也就是和老年代同时实现垃圾收集。替换成元空间以后,简化了 Full GC。可以在不进行暂停的情况下并发地释放类 数据,同时也提升了 GC 的性能 Oracle 要合并 Hotspot 和 JRockit 的代码,而 JRockit 没有永久代。

syncronized是怎么实现的

回答:使用monitorenter和monitorexit,在对象头进行加锁

补充:最好把锁升级的过程都讲清楚

volatile实现什么能力,怎么实现的

回答:可见性,CPU core分别有自己的cache,彼此之间不可见,使用volatile会强制将cache写入主存,和从主存加载数据

补充:还有禁止指令重排,当一个变量被volatile修饰时,编译器和处理器会禁止对其进行指令重排序,从而保证程序的正确性

java匿名类和lambda表达式为什么要将变量final

回答:final是不可变的,线程安全,避免共享变量被其他线程修改

缓存设计有哪些方案

回答:常见的有cache aside,read/write through

追问:区别是什么?

回答:

  • (1)cache aside,client需要和cache和db交互,针对读,client先访问cache,miss后访问db,并写回cache;针对写,client直接写db,并将cache设为失效;
  • (2)read/write through,client只需要跟存储服务交互,存储服务去操作cache和db,针对读,存储服务访问cache,miss后,存储服务访问db加载数据并存入cache;针对写,如果数据在cache中,存储服务写cache和db,cache写回db,如果数据不在cache中,存储服务写db;
  • (3)write behind caching;client只需要跟cache交互,针对读,client访问cache,miss后,cache访问db加载数据并存入cache;针对写,将数据写到cache,cache异步写回db

历史好文:

成就感又被拉满了!

我扛住字节面试了,太干了!

难度上来了!阿里面的问题好多啊

腾讯面试比之前的要难,开始会胡说八道了

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存