面试复盘 | 百度MEG-QA提前批Java后端三面面经
如流 软件视频面试,手撕代码时共享屏幕
一面 8.9
面试官是个小姐姐,面试官首先自我介绍,说了一下大概的面试流程,赞
-
自我介绍(比较短,一直不知道怎么自我介绍)
-
问项目
-
Redis为什么快(基于内存,IO多路复用,单线程,使用C语言并有很多优化)
-
Redis数据结构对于内存占用的优化(sdshdr5, sdshdr8, sdshdr16, sdshdr32, sdshdr64, 字符串越短,使用越少的内存存储额外信息;list 和 hash 元素少的时候使用 ziplist 编码)
-
Mysql 索引类型(聚簇索引和非聚簇索引,hash索引)
-
数据库读写分离的优缺点(写会加锁,降低数据库并发量,读写分离提高并发量;缺点是读服务器会存在延迟)
-
rabbitmq 介绍(说了topic,direct,fanout,header模式),重复消费问题(没答上来,说项目中没考虑到)
-
springboot 最大的特点(自动配置),启动注解和配置文件(记不清了)
-
JVM 内存模型和各自作用(程序计数器,JVM虚拟机栈,本地方法栈,堆,方法区),哪些是线程私有的(程序计数器,JVM虚拟机栈,本地方法栈)
-
String 能被继承吗(不能,被final修饰),和StringBuilder,StringBuffer区别(这两个可变,StringBuffer线程安全)
-
重写和重载区别(重载:方法名字相同,参数不同;重写发生在运行期,是子类对父类的允许访问的方法的实现过程进行重新编写),重写的修饰符和抛出异常大小(重写方法的修饰符更大,异常更小)
-
查看进程的指令(ps),查看cpu使用情况(top),改变文件权限(chmod)
-
TCP 可靠性(面向连接,数据包校验,重新排序,超时重发,流量控制)
算法题:
-
判断一颗树是否为avl树(递归做)
-
判断一个数是否回文(转换为字符数据,使用双指针法或者StringBuilder的reverse()方法)
最后反问
总结:rabbitmq,springboot 只是使用,没有详细了解原理,相关问题没答上来
薄弱点:
-
Springboot还需要继续学习,了解原理
-
Rabbitmq常见问题的解决方案要熟悉,挺常问的
-
自我介绍一直很短,一分钟以内,想问下大家都是怎么自我介绍,要介绍的多细
二面 8.12
-
接口和抽象类区别(接口是动作的抽象,抽象类是一种所属关系...)
-
volatile作用(可见性,禁止指令重排),什么是可见性问题
-
常见容器(List,Set,Hashmap),Hashmap原理(数组 + 链表、红黑树),resize() 过程,多线程会产生什么问题(循环链表),怎么产生循环链表(没答出来)
-
怎么解决HashMap多线程问题(加锁),说了ConcurrentHashMap的put过程
-
说说线程(CPU调度分派基本单位...)
-
进程如何同步(管道,命令管道,信号,信号量,共享内存,套接字),信号量怎么通信(P操作,V操作)
-
线程独有的对象(ThreadLocal,原理没说清)
-
类加载机制(双亲委派模型),有什么加载器,分别加载什么,怎么破坏双亲委派机制(重写loadClass方法),破坏双亲委派机制自己实现加载器加载java.lang.String可以吗(不可以,不懂怎么保证的)
-
标记-清理过程
代码:
-
单例模式
-
最长回文子串(动态规划,中心扩散)
-
包含min函数的栈(栈 + 辅助栈)
问题讨论:
-
HashMap多线程下循环链表产生的原理,有大佬详细说一下嘛
-
破坏双亲委派机制后,怎么保证java.lang.String不能加载(java.lang.ClassLoaderd的preDefineClass 方***检查类名,发现以java作为一级包名,则抛出安全异常:禁止使用的包名)