3月java面试总结
前言
这段时间的面试总算是告一段落了。回想起近半个月的面试体验,感觉有必要总结总结经验得失,也为以后留个备忘。这段时间共经历7次面试+2次电面。公司有大有小,有产品也有外包,面试形式也多种多样,真可是体验了一番。最大的感慨还是感觉自己技术体系有欠缺,不完整。书到用时方恨少真是面试时的最佳描述了,今后还是要多学多实战。
再者推荐两本书吧,一是《深入理解java虚拟机 第二版》,这本书简直是java进阶必备啊,从我经历的面试来看,除了某些外包公司外,还真没哪个公司不问虚拟机垃圾回收的。书中讲的也很好,十分推荐。
还有一本是 《java并发编程的艺术》,这本书是讲多线程并发相关的,也是进阶必备知识。之所以没说《Java并发编程实战》是因为感觉它有些晦涩,如果先读前者再读的话可能会好些。
知识汇总
面试中涉及到知识有java基础知识,JVM、设计模式、并发与多线程、分布式相关、数据库、缓存、算法等,整理如下:
基础知识
1. HashMap、ConcurrentHashMap相关
HashMap是必问的,主要问到的点有HashMap的原理及结构(注意java7和java8的区别),HashMap和HashTable的区别,是线程安全的吗,HashMap在多线程中怎样发生的死锁?总体来说HashMap问的挺多,需要掌握到源码级别。ConcurrentHashMap也有机率会问到,一般问的是它怎样保证线程安全(注意java7和java8的区别)。
2. IO/NIO
两者的概念、区别,使用场景
3. 面向对象相关
面向对象三大特征,抽象类和接口的区别,值传递和引用传递理解等。
还有值类比较相等,如Integer,主要考察Integer缓存策略,详见Integer判断相等,到底该用==还是equals
4. 类加载顺序
在笔记题中遇到过,一般是子类继承父类,在静态方法和构造函数打印语句,求执行顺序等。
5. 页面优化
勉强算放基础吧,一般会问一个页面加载很慢可以从哪些地方排查,考经验的。
JVM
- JVM内存结构及各部分作用(必问)
- 常见的垃圾回收算法(上面答了就必问)
- 了解常见的垃圾回收器(如CMS、G1等)
- 对象被回收的条件,可作为GC Root的对象有哪些?
- 新生代向老年代晋升的条件及过程描述
JVM内存结构划分及常见的垃圾回收算法算是必问的了,需了解。
### 设计模式
- 常见的设计模式有哪些?
- 说一个你熟悉的设计模式并画出类图。
- 代理模式的使用场景?
- Spring/Spring MVC用到了哪些设计模式?
常用设计模式及与现实场景、框架的结合
数据库与缓存
- MySQL有哪些存储引擎?有哪些区别?(主要是问InnoDB和MyISAM底层实现及区别,必问)
- 除了主键索引外,还有哪些索引?(普通、组合、唯一、全文等)
- 一条sql很慢可以从哪些方面排查(数据库优化,这个几乎都有问到)
- 数据库表设计,项目近期的表或者设计一个场景来设计表,哪些字段可以加索引等
- mongoDB储存机制
- redis/memcache区别
- 在你的项目中,redis都缓存了哪些数据?设置了多大的过期时间?
- redis是单线程的吗?为什么设计成单线程?(重要)
- 怎样使用redis实现分布式锁
数据库储存原理,索引、优化等
多线程
- java实现多线程的方式?除了继承Thread、实现Runnable还有吗?(Callable、线程池)
- java内存模型(工作内存、主内存那块,必问)
- volatile的作用及原理(必问)
- java并发包(java.util.concurrent)都有哪些类?
- java实现同步都有哪些方式?(重要)
- 线程池实现原理(重要)
- ReentrantLock实现原理?可读写锁呢?
- ThreadLocal原理,使用场景
- notify/wait 通知阻塞机制
多线程是重点,主要有java并发包及java内存模型
数据结构与算法
数据结构这块一般结合算法来考察,主要是栈、链表、Map、二分查找、B/B+树等
- B/B+树结构及区别(一般在mysql储存引擎那边问,或给你几个数让你构造B/B+树)
- 二分查找算法、归并排序(常用算法都应掌握)
- 怎样使用栈实现四则运算,说说思路
- 手写一个链表,怎样添加、删除节点方法
### 框架相关
- Spring的Ioc、AOP(老生常谈,必问)
- Spring AOP的实现方式,使用场景(重要)
- Spring MVC整体流程(必问),其中的关键类有哪些?
- 过滤器和拦截器的区别
- mybatis中
#{}
和${}
有哪些区别? - netty实现原理
- @Resource和@Autowired区别?分别来自哪里?
分布式
- zookeeper实现原理?是怎样保证数据一致性的?(重要)
- 分布式锁有哪些实现方式?(重要)
- rpc理解
- dubbo是怎样实现的?为什么要用dubbo?
分布式这块我不太熟,所以问的也不多,重点集中在对zookeeper的理解上了。
其他
其他一些就和项目以及你的个人简历相关了,介绍一下最近的项目,有哪些难点,怎样解决之类的,或是你简历中有其他可供提问的技术等,因人而异了。
总结
问法多种多样,核心原理是一样的。从面试问的题来看,JVM、多线程和数据库是每次都会涉及的东西。另外,有一定名气的公司都会重视基础,无论大小。今后的学习方向还应从实战入手,深入架构原理分析。