参考链接:https://www.nowcoder.com/experience/639
用于汇总Java后端各个校招、社招、实习面经,附自己答案
1. 一面
- ConcurrentHashMap原理:JDK1.8之后是volatile定义的Node数组 + 链表 + 红黑树,对数组头结点加锁来保证线程安全。具体put加锁过程是采用synchronized + cas自旋实现,而get是voaltile,就可以直接读
- CopyOnWriteArrayList原理:适合读多写少场景,内部添加,复制都是对底层赋值的操作实现,由于list,set非线程安全,所以内部修改数据加了reentranlock锁
synchronized
做的优化手段有哪些
- 锁升级、锁粗化、锁消除
JVM
垃圾回收器: Parallel Scavenge + Parallel old。但是网上说的比较多的都是CMS + G1,后面得学下。
- 身份证号用主键索引是否合适呢: 肯定是不合适,因为主键索引在B+数中使用递增id最好,而且身份证不一定都是数字,而且太长的主键索引查询也会影响效率
- TCP连接已经建立了,但是客户端故障了,会怎么样
- TCP会开启keep-alive,若长期未收到相应就主动关闭连接
- 若服务器崩溃,会发送RST包让客户端关闭链接
- 计算机的交换空间了解吗:内存不够用,到辅存中置换空间
Spring
的自动注入底层调用了什么方法:set注入,有@Autowired,@resource,@inject这几种注解
IOC
如何实现的:控制反转,使用工厂模式和反射机制实现对象创建由spring创建
- 数据库有上百亿条数据,要输出到一个文本文件中,谈谈有哪些值得思考的地方:
- 使用多线程异步读取数据库百亿数据,控制线程数,避免内存OOM
- 使用buffer缓存流操作文件的IO
- 多线程异步输出到各个文件后,最后做文件合并
- 假设说我写一半,服务挂掉了,重启之后我肯定不想重头开始,而是继续读取,怎么处理
- 断点续传:randomAccessFile,每次往里面输入数据都先读取文件长度
2.二面
1. 操作系统`32`位和`64`位有什么区别
1. 核心区别:cpu处理器一次能处理数据的最大位数
2. 64位可以兼容32,反之却不行
二面其余问题都是一些实际项目业务的了
2.HR面
HR面都是问的自我评价和一些学习路线之类的了