面试感触
最近在换工作,面了不少公司,拿到了满意的offer,谈一下作为java开发人员应该具备的技术点
个人背景
- 学校:**大学
- 专业: 软件工程
- 学历:本科
- 毕业时间:2017年
工作一年应该具备的能力
我认为如果你一个工作经验为1-3年的开发人员,使用开发语言为java,这个时候需要具备以下能力
基础篇:
- 异常体系
- 集合体系
- 线程体系
- IO 体系
提升篇:
- jvm
- 数据库优化
- 性能优化
- Spring
项目相关
- 架构清晰
- 难点、亮点
- 你的看法(设计缺陷、后期发展)
检验能力
看到上面所提及到的知识点,你可能在想这不是随便一个开发人员都会的吗?现实情况并非如此。可以来检验一下,看看你掌握的程度。
基础篇
- 异常体系
- throw throws 区别
- try 和 finally 内都有return的情况
- 检查异常和非检查异常
- 项目中针对异常的处理方案(错误状态码、全局异常处理、日志记录等)
- 集合体系
- ArrayList 和 LinkedList
- HashMap、HashTable、CurrentHashMap 的实现原理、区别、使用场景
- 集合中Set 如何实现的
- LinkedHashMap 作用、以及如何利用他实现缓存的LRU
线程体系
- 创建、启动线程方式
- 线程的几种状态
- 线程池的类型、内部结构(阻塞队列、工作线程集…)、初始化参数
- 线程之间的几种通讯方式
- 线程的中断机制
- 锁:synchronize 和 juc中的锁区别
- 如何解决死锁问题
- ThreadLocal
IO体系
- BIO、NIO、AIO区别以及对应java实现
- IO流等
- 序列化、反序列化、自定义序列化等
提升篇
- jvm
- jvm 运行时数据区
- JMM
- 什么样的对象可以是GC Roots?
- 垃圾回收算法、垃圾回收器
- jstack 、jmap分析栈和堆方法
- 类加载机制
- 数据库优化
- 数据库的存储引擎
- 索引的实现原理、使用技巧
- 分析工具explain
- join 操作的优化方式
- 性能优化
- CPU (top+jstack 去排查)
- mem (top+jmap+内存分析工具排查)
- IO
- NET
- Spring
- AOP: jdk动态代理和CGlib 代理实现方式区别
- ICO如何管理Bean
- Bean 作用域、加载方式(lazy-init、nonlazy-init)
以上只是列举了部分经常问的问题,但是万变不离其中,从结构体系到实现原理掌握清楚了问题怎么变,都不会难到你的。
这边我想特别说一下性能优化这一块,因为这个是问得比较多的,但是我们开发确实很少接触的。这个时候回答出主要思路即可。
- 优化点分为四个CPU、IO、MEM、NET
- 如何定位问题:top、iostat等命令查看使用率
- jstack 、jmap等工具进一步定位具体问题
- 通过jvm 参数调整来进行优化
总结
对于搞技术的人来说,能力永远是你和人家谈判的筹码,唯有不断学习,不断总结才能让你在这个森林里有一席之地。