珠海某科技公司面试Java程序员

由于公司主要业务在香港的原因,一上来就给了两份资料让我填,一份用中文填的基本资料,另一份需要用英文回答三个问题,分别是:怎么解决在项目中遇到的问题?你的职业理想是什么?……
没有笔试(可能是我让朋友内退的原因吧)

一面(技术面),两个面试官

1. 自我介绍
2. 介绍印象深刻的项目,我介绍的是最新在做的项目,用到的技术,自己做的哪些模块?
回答:讲了用到的设计模式——模版方法,然后讲了模式方法的实现
3. 因为最新的项目用到了,问了Spring Boot,Spring的区别?
回答:去配置化话,然后其他的基本一样,顺便说了一下Spring MVC的原理
4. Spring 的 bean是什么?我说了IOC、DI、Bean之间的关系
5. Hibernate 和 Mybatis的区别?
6. 因为项目中用到了webservice,问了创建的方式,怎么访问?
回答:通过SOAP协议访问,创建的方式我忘记了…(我用的是EndPoint发布的)
7. 因为简历中讲到了我个人的电商秒杀系统(个人喜好写的,提升自己的技术栈)问我怎么实现一个高并发系统?
回答:
横向扩展(用nginx实现负载均衡,提高服务器性能等等)
纵向扩展
1. MQ队列实现异步下单,减轻服务器的压力
2. redis缓存减轻数据库的压力,redis的算法原理,常用的hash算法、以及一致性hash算法的原理,然后就说具体的做法了,SSO单点登录的时候用redis中存放用户信息
3. 缓存秒杀列表界面的方式
4. 前后端分离的开发模式
其实还有很多个,不过我没有用到,比如说服务降级(天猫双11的时候经常会关闭一下评价或者说不怎么常使用的模块)、数据库分库分表
8. 线程的创建方式?怎么实现线程安全?
回答:通过多个线程对static的变量进行++操作,
(1)利用A.Q.S的相关类比如说AtomicInteger的线程安全的类,顺便说了一波实现原理CAS算法(看过相关
的博客,略懂),Java的内存模型等等
(2)利用线程封闭的方式,
(3)利用synchronized、Lock的方式,顺便说了一下两者的区别,
(4)我还说了一些线程不安全的类,比如说HashMap(大概说了一下源码实现),可以使用concurrenthashmap (说了分段锁,其实也是利用CAS算法)…
(5) volatile关键字实现线程安全的用法以及场景,因为volatile保证了线程的可见性、禁止指令重排序,可以用来做来状态变量,如果比如说

//线程1
boolean stop = false;
while(!stop){
    doSomething();
}
 
//线程2
stop = true;

因为volatile不具备原子性操作,不适合用来作为原子性操作的场景
9. 只有static的变量是不安全的吗?还有别的吗?
回答:堆、方法区都是线程共享的,栈是线程独有的,比如说类变量、静态变量都是放在堆、方法区中的,会有线程不安全的情况,栈中的内容是线程独有的,然后再说了下Java的内存模型,从主内存到线程的栈内存
10. 敏捷开发懂不懂?
回答:举例了平时的项目(类似敏捷开发):每周出一次build,然后客户不满意,改,继续出build;改bug,QA测试有问题,继续改…..
11. 个人电商项目的访问数量级?有没有并发的数量要求?
回答:我说因为是个人项目没有统计具体说是什么,会使用Jmeter工具测试优化前后的QPS变化量
12. 怎么保证代码质量?
13. 公司项目的数量级,数据库的量级?
………………
好了,一个小时多的面试结束了,感觉自己回答的一般,因为webservice的发布方式忘记了,自己还用过。。

二面 HR面试

  1. 为什么离开上家公司?
  2. 为什么来贵公司?
  3. 怎么提升自己的技术?
    …….
    因为HR面的问题都比较常规不就一一列举了,HR说基本上技术面试过就有offer了…..惊喜,让我回去等offer

总结

1. 看书

可能是自己准备的比较充分的原因,准备的很多问题都还没有提问就结束了,推荐大家一定要多看看《深入理解Java虚拟机》,我个人下载了PDF,反复看了(顺便翻翻)很多遍,比如说初始化一个类的过程一定要知道,类变量、成员变量、常量、方法的存放区域,java的内存模型等等,这次的面试我就说了很多关于JVM的知识点。还有就是《Java并发编程实战》(我买了一直没翻过,然后找的并发编程的视频看),《Head First设计模式》(我都是上网看的博客),然后自己尝试画画设计图,面试前常用的设计模式都熟悉了一遍,比如说单例模式(每一次写法,恶汉,懒汉,哪一种实现懒加载,双重锁校验为什么要加volatile等等)、装饰者模式(IO源码)等等……

2. 源码实现

比如说Spring MVC的实现原理,这个很基础了,源码肯定要看过、熟悉设计细想(就是Dispatcherservlet.java这个类了),Spring IOC、AOP的原理,底层原理实现,IOC相关的DI、Bean之前的关系,AOP相关的切面(aspect)、连接点(joinpoint)、切入点(pointcut)、通知(advice)、代理模式、JDK动态代理、CGLib动态代理

3. 封装做过的 项目,使用的技术,一般面试官不怎么喜欢听项目的业务,主要想看你用的技术,这里推荐两篇文章,可以看看 面试时这样介绍自己的项目经验,成功率能达到98.99%平时的你VS面试的你

结尾

写到这里就写完了,如果有哪里写的不好麻烦大家指点指点,因为我经常会在头条看Java面试经验,所以这次也想写写文章跟大家交流交流。

    原文作者:菜鸟程序员一枚
    原文地址: https://www.jianshu.com/p/8efdb9b51e71#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞