二面美团,有惊无险已拿 offer,不得不说“太难了”
记一次美团程序员面试经历
一面
自我介绍
项目中的监控:那个监控指标常见的有哪些?
微服务涉及到的技术以及需要注意的问题有哪些?
注册中心你了解了哪些?
consul 的可靠性你了解吗?
consul 的机制你有没有具体深入过?有没有和其他的注册中心对比过?
项目用 Spring 比较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理
Spring Boot 除了自动配置,相比传统的 Spring 有什么其他的区别?
Spring Cloud 有了解多少?
Spring Bean 的生命周期
HashMap 和 hashTable 区别?
Object 的 hashcode 方法重写了,equals 方法要不要改?
Hashmap 线程不安全的出现场景
线上服务 CPU 很高该怎么做?有哪些措施可以找到问题
JDK 中有哪几个线程池?顺带把线程池讲了个遍
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
SQL 索引的顺序,字段的顺序
查看 SQL 是不是使用了索引?(有什么工具)
TCP 和 UDP 的区别?TCP 数据传输过程中怎么做到可靠的?
说下你知道的排序算法吧
查找一个数组的中位数?
二面
你有什么问题想问我的吗?(常规问询)
自我介绍、工作经历、技术栈
项目中你学到了什么技术?
微服务划分的粒度?
微服务的高可用怎么保证的?
负载均衡与反向代理,隔离,限流,降级,超时与重试,回滚,压力测试与应急预案
常用的负载均衡,该怎么用,你能说下吗?
(技术问)
http 重定向
DNS 负载均衡
反向代理负载均衡
IP 负载均衡(LVS-NAT)
直接路由(LVS-DR)
IP 隧道(LVS-TUN)
网关能够为后端服务带来哪些好处?
Spring Bean 的生命周期
xml 中配置的 init、destroy 方法怎么可以做到调用具体的方法?反射的机制
Object 类中的方法
对象比较是否相同
hashmap put 方法存放的时候怎么判断是否是重复的
Object toString 方法常用的地方,为什么要重写该方法
Set 和 List 区别?
ArrayList 和 LinkedList 区别
如果存取相同的数据,ArrayList 和 LinkedList 谁占用空间更大?
Set 存的顺序是有序的吗?
常见 Set 的实现有哪些?
TreeSet 对存入对数据有什么要求呢?
HashSet 的底层实现呢?
TreeSet 底层源码有看过吗?
HashSet 是不是线程安全的?为什么不是线程安全的?
Java 中有哪些线程安全的 Map?
HashTable 你了解过吗?
如何保证线程安全问题?
synchronized、lock
volatile 的原子性问题?为什么 i++ 这种不支持原子性?从计算机原理的设计来讲下不能保证原子性的原因 happens before 原理
cas 操作
lock 和 synchronized 的区别?
公平锁和非公平锁
Java 读写锁
读写锁设计主要解决什么问题?
你项目除了写 Java 代码,还有前端代码,那你知道前端有哪些框架吗?
MySQL 分页查询语句
MySQL 事务特性和隔离级别
二、事务的并发问题
不可重复读会出现在什么场景?
sql having 的使用场景
前端浏览器地址的一个 http 请求到后端整个流程是怎么样?
http 默认端口,https 默认端口
DNS 你知道是干嘛的吗?
你们开发用的 ide 是啥?你能说下 idea 的常用几个快捷键吧?
代码版本管理你们用的是啥?
git rebase 和 merge 有什么区别?
你们公司加班多吗?(题外话)
举例回答:
项目用 Spring 比较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理
答:(1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。 对于 Spring 而言,就是由 Spring 来控制对象的生命周期和对象之间的关系;IoC 还有另外一个名字——“依赖注入(Dependency Injection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,即由容器动态地将某种依赖关系注入到组件之中。
(2). 在 Spring 的工作方式中,所有的类都会在 spring 容器中登记,告诉 spring 这是个什么东西,你需要什么东西,然后 spring 会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring 来控制,也就是说控制对象生存周期的不再是引用它的对象,而是 spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被 spring 控制,所以这叫控制反转。
(3). 在系统运行中,动态的向某个对象提供它所需要的其他对象。
(4). 依赖注入的思想是通过反射机制实现的,在实例化一个类时,它通过反射调用类中 set 方法将事先保存在 HashMap 中的类属性注入到类中。 总而言之,在传统的对象创建方式中,通常由调用者来创建被调用者的实例,而在 Spring 中创建被调用者的工作由 Spring 来完成,然后注入调用者,即所谓的依赖注入 or 控制反转。 注入方式有两种:依赖注入和设置注入; IoC 的优点:降低了组件之间的耦合,降低了业务对象之间替换的复杂性,使之能够灵活的管理对象。
AOP(Aspect Oriented Programming)
(1). AOP 面向方面编程基于 IoC,是对 OOP 的有益补充;
(2). AOP 利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
(3). AOP 代表的是一个横向的关 系,将“对象”比作一个空心的圆柱体,其中封装的是对象的属性和行为;则面向方面编程的方法,就是将这个圆柱体以切面形式剖开,选择性的提供业务逻辑。而 剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹,但完成了效果。
(4). 实现 AOP 的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
(5). Spring 实现 AOP:JDK 动态代理和 CGLIB 代理 JDK 动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理;其核心的两个类是 InvocationHandler 和 Proxy。 CGLIB 代理:实现原理类似于 JDK 动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB 是高效的代码生成包,底层是依靠 ASM(开源的 java 字节码编辑类库)操作字节码实现的,性能比 JDK 强;需要引入包 asm.jar 和 cglib.jar。 使用 AspectJ 注入式切面和 @AspectJ 注解驱动的切面实际上底层也是通过动态代理实现的。
(6). AOP 使用场景:
Authentication 权限检查
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 延迟加载
Debugging 调试
logging, tracing, profiling and monitoring 日志记录,跟踪,优化,校准
Performance optimization 性能优化,效率检查
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务管理
另外 Filter 的实现和 struts2 的拦截器的实现都是 AOP 思想的体现。
美团面试场景以及面试答案(文档总结)
最后
本人也收藏了一份 Java 面试核心知识点来应付面试,借着这次机会可以免费送给我的读者朋友们:
目录:
Java 面试核心知识点
一共有 30 个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!资料已整理成文档,需要获取的小伙伴可以+ VX: mxk6072
Java 面试核心知识点
已经有读者朋友靠着这一份 Java 面试知识点指导拿到不错的 offer 了,各位读者朋友们
评论