两个月就拿到了蚂蚁offer,大厂面试也不过如此!面试题自测
前言
熟练的掌握Java的核心底层技能很重要,这样才能从容面对面试官的种种考验,小编整理的这份面试清单都是各大厂的面试真题总结得出来的,感兴趣的挑战自己的技术层级的就赶紧来试试吧,大厂一定是行业发展的方向标杆!
阿里一面
1、如何查看线程死锁
- 1.可以通过jstack命令来进⾏查看,jstack命令中会显示发⽣了死锁的线程
- 2.或者两个线程去操作数据库时,数据库发⽣了死锁,这是可以查询数据库的死锁情况
2、还读过哪些框架源码介绍⼀下你还熟悉的
这个问题⽐较⼴泛,你即可以说:HashMap、线程池等JDK⾃带的源码,也可以说Mybatis、Spring Boot、Spring Cloud、消息队列等开发框架或中间件的源码
3、说⼀下HashMap的Put⽅法
-
- 根据Key通过哈希算法与与运算得出数组下标
-
- 如果数组下标位置元素为空,则将key和value封装为Entry对象(JDK1.7中是Entry对象,JDK1.8中是Node对象)并放⼊该位置
-
- 如果数组下标位置元素不为空,则要分情况讨论
a. 如果是JDK1.7,则先判断是否需要扩容,如果要扩容就进⾏扩容,如果不⽤扩容就⽣成Entry对象,并使⽤头插法添加到当前位置的链表中
b. 如果是JDK1.8,则会先判断当前位置上的Node的类型,看是红⿊树Node,还是链表Node
- i. 如果是红⿊树Node,则将key和value封装为⼀个红⿊树节点并添加到红⿊树中去,在这个过程中会判断红⿊树中是否存在当前key,如果存在则更新value
- ii. 如果此位置上的Node对象是链表节点,则将key和value封装为⼀个链表Node并通过尾插法插⼊到链表的最后位置去,因为是尾插法,所以需要遍历链表,在遍历链表的过程中会判断是否存在当前key,如果存在则更新value,当遍历完链表后,将新链表Node插⼊到链表中,插⼊到链表后,会看当前链表的节点个数,如果⼤于等于8,那么则会将该链表转成红⿊树
- iii. 将key和value封装为Node插⼊到链表或红⿊树中后,再判断是否需要进⾏扩容,如果需要就扩容,如果不需要就结束PUT⽅法
4、说⼀下ThreadLocal
-
- ThreadLocal是Java中所提供的线程本地存储机制,可以利⽤该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意⽅法中获取缓存的数据
-
- ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象(注意不是ThreadLocal对象)中都存在⼀个ThreadLocalMap,Map的key为ThreadLocal对象,Map的value为需要缓存的值
-
- 如果在线程池中使⽤ThreadLocal会造成内存泄漏,因为当ThreadLocal对象使⽤完之后,应该要把设置的key,value,也就是Entry对象进⾏回收,但线程池中的线程不会回收,⽽线程对象是通过强引⽤指向ThreadLocalMap,ThreadLocalMap也是通过强引⽤指向Entry对象,线程不被回收,Entry对象也就不会被回收,从⽽出现内存泄漏,解决办法是,在使⽤了ThreadLocal对象之后,⼿动调⽤ThreadLocal的remove⽅法,⼿动清楚Entry对象
-
- ThreadLocal经典的应⽤场景就是连接管理(⼀个线程持有⼀个连接,该连接对象可以在不同的⽅法之间进⾏传递,线程之间不共享同⼀个连接)
5、Dubbo的负载均衡策略
Dubbo⽬前⽀持:
-
- 平衡加权轮询算法
-
- 加权随机算法
-
- ⼀致性哈希算法
-
- 最⼩活跃数算法
6、Dubbo是如何做系统交互的
Dubbo底层是通过RPC来完成服务和服务之间的调⽤的,Dubbo⽀持很多协议,⽐如默认的dubbo协议,⽐如http协议、⽐如rest等都是⽀持的,他们的底层所使⽤的技术是不太⼀样的,⽐如dubbo协议底层使⽤的是netty,也可以使⽤mina,http协议底层使⽤的tomcat或jetty。
服务消费者在调⽤某个服务时,会将当前所调⽤的服务接⼝信息、当前⽅法信息、执⾏⽅法所传⼊的⼊参信息等组装为⼀个Invocation对象,然后不同的协议通过不同的数据组织⽅式和传输⽅式将这个对象传送给服务提供者,提供者接收到这个对象后,找到对应的服务实现,利⽤反射执⾏对应的⽅法,得到⽅法结果后再通过⽹络响应给服务消费者。
当然,Dubbo在这个调⽤过程中还做很多其他的设计,⽐如服务容错、负载均衡、Filter机制、动态路由机制等等,让Dubbo能处理更多企业中的需求。
Java学习笔记共享地址:阿里、京东、蚂蚁等大厂面试真题解析
7、说⼀下ArrayList和LinkedList区别
-
- ⾸先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的
-
- 由于底层数据结构不同,他们所适⽤的场景也不同,ArrayList更适合随机查找,LinkedList更适合删除和添加,查询、添加、删除的时间复杂度不同
-
- 另外ArrayList和LinkedList都实现了List接⼝,但是LinkedList还额外实现了Deque接⼝,所以LinkedList还可以当做队列来使⽤
8、说⼀下Spring的事务机制
-
- Spring事务底层是基于数据库事务和AOP机制的
-
- ⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean
-
- 当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解
-
- 如果加了,那么则利⽤事务管理器创建⼀个数据库连接
-
- 并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,这是实现Spring事务⾮常重要的⼀步
-
- 然后执⾏当前⽅法,⽅法中会执⾏sql
-
- 执⾏完当前⽅法后,如果没有出现异常就直接提交事务
-
- 如果出现了异常,并且这个异常是需要回滚的就会回滚事务,否则仍然提交事务
-
- Spring事务的隔离级别对应的就是数据库的隔离级别
-
- Spring事务的传播机制是Spring事务⾃⼰实现的,也是Spring事务中最复杂的
-
- Spring事务的传播机制是基于数据库连接来做的,⼀个数据库连接⼀个事务,如果传播机制配置为需要新开⼀个事务,那么实际上就是先建⽴⼀个数据库连接,在此新数据库连接上执⾏sql
9、什么时候@Transactional失效
因为Spring事务是基于代理来实现的,所以某个加了@Transactional的⽅法只有是被代理对象调⽤时,那么这个注解才会⽣效,所以如果是被代理对象来调⽤这个⽅法,那么@Transactional是不会⽣效的。
同时如果某个⽅法是private的,那么@Transactional也会失效,因为底层cglib是基于⽗⼦类来实现的,⼦类是不能重载⽗类的private⽅法的,所以⽆法很好的利⽤代理,也会导致@Transactianal失效。
10、说⼀下JVM中,哪些是共享区,哪些可以作为gc root
1、堆区和⽅法区是所有线程共享的,栈、本地⽅法栈、程序计数器是每个线程独有的
2、什么是gc root,JVM在进⾏垃圾回收时,需要找到“垃圾”对象,也就是没有被引⽤的对象,但是直接找“垃圾”对象是⽐较耗时的,所以反过来,先找“⾮垃圾”对象,也就是正常对象,那么就需要从某些“根”开始去找,根据这些“根”的引⽤路径找到正常对象,⽽这些“根”有⼀个特征,就是它只会引⽤其他对象,⽽不会被其他对象引⽤,例如:栈中的本地变量、⽅法区中的静态变量、本地⽅法栈中的变量、正在运⾏的线程等可以作为gc root。
11、介绍⼀下Spring,读过源码介绍⼀下⼤致流程
12、线程之间如何进⾏通讯的
-
- 线程之间可以通过共享内存或基于⽹络来进⾏通信
-
- 如果是通过共享内存来进⾏通信,则需要考虑并发问题,什么时候阻塞,什么时候唤醒
-
- 像Java中的wait()、notify()就是阻塞和唤醒
-
- 通过⽹络就⽐较简单了,通过⽹络连接将通信数据发送给对⽅,当然也要考虑到并发问题,处理⽅式就是加锁等⽅式
13、你们项⽬如何排查JVM问题
阿里二面
1、聊聊你最有成就感的项⽬
2、Spring中后置处理器的作⽤
3、说说你了解的分布式锁实现
4、Innodb是如何实现事务的
5、Redis集群策略
6、Jdk1.7到Jdk1.8 java虚拟机发⽣了什么变化?
7、如何实现AOP,项⽬哪些地⽅⽤到了AOP
8、Mysql数据库中,什么情况下设置了索引但⽆法使⽤?
9、Redis的数据结构及使⽤场景
10、Jdk1.7到Jdk1.8 HashMap 发⽣了什么变化(底层)?
11、⾃⼰最有挑战的项⽬、难点
12、说说常⽤的SpringBoot注解,及其实现
蚂蚁一面
1、强平衡⼆叉树和弱平衡⼆叉树有什么区别
2、sychronized和ReentrantLock的区别
3、B树和B+树的区别,为什么Mysql使⽤B+树
4、HTTPS是如何保证安全传输的
5、⼆叉搜索树和平衡⼆叉树有什么关系?
6、sychronized的⾃旋锁、偏向锁、轻量级锁、重量级锁,分别介绍和联系
7、简述线程池原理,FixedThreadPool⽤的阻塞队列是什么
8、epoll和poll的区别
蚂蚁二面
1、volatile关键字,他是如何保证可⻅性,有序性
2、Java的内存结构,堆分为哪⼏部分,默认年龄多⼤进⼊⽼年代
3、Mysql的锁你了解哪些
4、设计模式有哪些⼤类,及熟悉其中哪些设计模式
5、ConcurrentHashMap 如何保证线程安全,jdk1.8 有什么变化
京东一面
1、SpringCloud各组件功能,与Dubbo的区别
2、谈谈ConcurrentHashMap的扩容机制
3、项⽬及主要负责的模块
4、深拷⻉和浅拷⻉
5、遇到过哪些设计模式?
6、Java死锁如何避免?
7、Spring中Bean是线程安全的吗?
8、Maven中Package和Install的区别
9、说说你常⽤的Linux基本操作命令
10、如果你提交任务时,线程池队列已满,这时会发⽣什么
京东二面
1、泛型中extends和super的区别
2、Spring⽤到了哪些设计模式
3、说说类加载器双亲委派模型
4、简述CAP理论
5、画出项⽬架构图,介绍⾃⼰所处的模块
6、TCP的三次握⼿和四次挥⼿
7、图的深度遍历和⼴度遍历
8、消息队列如何保证消息可靠传输
9、并发编程三要素?
10、快排算法
由于篇幅有限,小编这里把剩下的面试真题整理成了文档,该文档获取方式:阿里、京东、蚂蚁等大厂面试真题解析