Java技术面试
技术面试
-
自己知识储备不足
-
准备OK,但是仍然没找到offer
主题: 出奇制胜
1.反对和所有应聘者 千篇一律
积累: 阿里巴巴 编程规范
《effective java》
2.反对和所有《面试宝典》 千篇一律
建议: 只看宝典里的题目,不看答案(答案自己写)
只看题目 + github/知乎/博客
- 线程通信 wait()、notify()/notifyAll()
Semaphore、google guava类库Monitor
public class MonitorDemo {
private LinkedList<Integer> buffer= new LinkedList<>() ;
private static final int MAX = 10 ;
//记录生产的数据编号
private static AtomicInteger count = new AtomicInteger(0) ;
//int i ; i++ ;非原子性操作 ; i++ 拆分成多行 ;线程安全问题
private Monitor monitor = new Monitor() ;
//生产数据
public void produce(int value){
try {
//enterWhen:相当于加锁
monitor.enterWhen( monitor.newGuard( ()-> buffer.size()<MAX ) ) ;
buffer.addLast( value);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
monitor.leave();
System.out.println("生产完毕,缓冲区大小:" + buffer.size());
}
}
//消费数据
public int consume(){
try {
monitor.enterWhen( monitor.newGuard( ()-> ! buffer.isEmpty() ) );
return buffer.removeFirst() ;
} catch (InterruptedException e) {
e.printStackTrace();
throw new RuntimeException(e) ;
}finally {
monitor.leave();
System.out.println("消费完毕,缓冲区大小:" + buffer.size());
}
}
public static void main(String[] args) {
MonitorDemo demo = new MonitorDemo() ;
ExecutorService executorService = Executors.newFixedThreadPool(6);
//将线程池包装
ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);
//向线程池放入3个生产者
for(int i=0;i<3;i++){
listeningExecutorService.submit( () ->{
while(true){
int result = count.getAndIncrement(); //i++ 0 1 2
demo.produce( result );
System.out.println("生产:"+ result);
}
} ) ;
}
//向线程池放入3个消费者
for(int i=0;i<3;i++){
while(true){
int result = demo.consume() ;
System.out.println("消费" +result);
}
}
ArrayList list = new ArrayList() ;
list.add("a") ;
}
}
3.源码级解决问题
-
产生一个问题?百度、谷歌、问老师。
-
面试官问: 请讲讲ArrayList如何扩容的?
-
我最初看书(看博客、文档),上面它的底层是动态数组,会在add()时 如果发现已满,则自动扩容1.5 。我还查阅了源码进行了验证,发现是在数组已满扩容,并且是通过 位移运算符扩容。
int newCapacity = oldCapacity + (oldCapacity >> 1);
4.找对时机,秀技能
每个人都有一些 独到的经验,要想办法在面试的时候 讲给面试官。
“聊聊自己的项目经验” ,讲项目,讲完的时候 加一句:我在做这个项目的时候 曾经遇到了一个bug,当时ArrayList.asList()返回一个List,当时通过阅读源码 发现 返回的List不是 Collection中的那个List。
5.比较通过的 秀点
-
优化类(JVM、SQL优化)
-
jvm优化:1.项目做完时,我用jmeter进行了压力测试,结果发现相应时间太慢(或者内存利用率太高) ,然后我用jvisualvm分析了下JVM的内存情况。分析后,进一步发现项目中的小对象太多了,并且发现这些小对象都是生命周期比较短的对象。然后我猜测可能就是由于短对象太多,造成了堆中新生代容量不足,进而让很多短对象逃逸到了老年代中。这样一来,新生代和老年代中的对象都会很多,就会加速GC的回收频率,从而降低系统的性能。对此,我调大了新生代的内存大小,并且调高了新生代 逃逸到老年代的 阈值。之后再测试,发现性能平稳了许多。
PS:以上短短200字,就告诉了面试官你有性能测试的良好习惯、会发现问题、分析问题,并且会JVM调优!
- 项目做完时,我用jmeter进行了压力测试,结果发现响应时间太慢。然后我用mysqldumslow工具查找到了项目中执行时间最长的那个SQL语句,因此猜测是这条SQL的性能太低,拖累了整个系统。然后我用explain查看了SQL执行计划,发现这个SQL根本没有写索引并且是大表驱动了小表,所以特别慢。之后,我给它后面的where查询字段加上了索引,并且改为了小表驱动大表。然后再次测试,响应时间就缩短了很多。
PS:这个秀点是“SQL优化”,具体流程是:定位慢SQL->使用explain查询SQL执行计划,用于分析SQL执行慢的原因->SQL优化。上述中的“小表驱动大表”等是SQL优化时的术语。
- 算法类的:字符串算法 (KMP算法)
6.技术沉淀
数据支撑: github、博客、专栏、微信公众号、项目发布到阿里云
7.大厂的区别
bat ,美团,字节调动,google facebook
数据结构和算法、操作系统、网络、设计模式、分布式、逻辑思维(8+11 ?)
8.心态建设
回答正确,但被面试官“否定”
-
答案来自于面试宝典,千篇一律
-
面试官自己在秀技术 ,调整好心态,不要受干扰。
正常面试官: 引导你来回答,而不是想方设法吓唬你
有没有用过List? 哪些常见子类?数组?动态扩容,不越界? -
如果问到 自己不会的?一定要答出自己的想法/答类似的框架, 虽然没用过这个新框架,但是我用过同类产品,并且相信他们是差不多的,然后就答这个同类产品的 实现原理。
mybatis \jpa
新dao框架 ? 映射文件/注释: 实体类-表, 然后通过框架本身的api的进行crud…
MQ:rabitmq rocketmq kafka\新MQ
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库