3月java面试总结

Posted by 梧桐和风的博客 on March 18, 2018

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

  1. JVM内存结构及各部分作用(必问)
  2. 常见的垃圾回收算法(上面答了就必问)
  3. 了解常见的垃圾回收器(如CMS、G1等)
  4. 对象被回收的条件,可作为GC Root的对象有哪些?
  5. 新生代向老年代晋升的条件及过程描述

JVM内存结构划分及常见的垃圾回收算法算是必问的了,需了解。

### 设计模式

  1. 常见的设计模式有哪些?
  2. 说一个你熟悉的设计模式并画出类图。
  3. 代理模式的使用场景?
  4. Spring/Spring MVC用到了哪些设计模式?

常用设计模式及与现实场景、框架的结合

数据库与缓存

  1. MySQL有哪些存储引擎?有哪些区别?(主要是问InnoDB和MyISAM底层实现及区别,必问)
  2. 除了主键索引外,还有哪些索引?(普通、组合、唯一、全文等)
  3. 一条sql很慢可以从哪些方面排查(数据库优化,这个几乎都有问到)
  4. 数据库表设计,项目近期的表或者设计一个场景来设计表,哪些字段可以加索引等
  5. mongoDB储存机制
  6. redis/memcache区别
  7. 在你的项目中,redis都缓存了哪些数据?设置了多大的过期时间?
  8. redis是单线程的吗?为什么设计成单线程?(重要)
  9. 怎样使用redis实现分布式锁

数据库储存原理,索引、优化等

多线程

  1. java实现多线程的方式?除了继承Thread、实现Runnable还有吗?(Callable、线程池)
  2. java内存模型(工作内存、主内存那块,必问)
  3. volatile的作用及原理(必问)
  4. java并发包(java.util.concurrent)都有哪些类?
  5. java实现同步都有哪些方式?(重要)
  6. 线程池实现原理(重要)
  7. ReentrantLock实现原理?可读写锁呢?
  8. ThreadLocal原理,使用场景
  9. notify/wait 通知阻塞机制

多线程是重点,主要有java并发包及java内存模型

数据结构与算法

数据结构这块一般结合算法来考察,主要是栈、链表、Map、二分查找、B/B+树等

  1. B/B+树结构及区别(一般在mysql储存引擎那边问,或给你几个数让你构造B/B+树)
  2. 二分查找算法、归并排序(常用算法都应掌握)
  3. 怎样使用栈实现四则运算,说说思路
  4. 手写一个链表,怎样添加、删除节点方法

### 框架相关

  1. Spring的Ioc、AOP(老生常谈,必问)
  2. Spring AOP的实现方式,使用场景(重要)
  3. Spring MVC整体流程(必问),其中的关键类有哪些?
  4. 过滤器和拦截器的区别
  5. mybatis中#{}${}有哪些区别?
  6. netty实现原理
  7. @Resource和@Autowired区别?分别来自哪里?

分布式

  1. zookeeper实现原理?是怎样保证数据一致性的?(重要)
  2. 分布式锁有哪些实现方式?(重要)
  3. rpc理解
  4. dubbo是怎样实现的?为什么要用dubbo?

分布式这块我不太熟,所以问的也不多,重点集中在对zookeeper的理解上了。

其他

其他一些就和项目以及你的个人简历相关了,介绍一下最近的项目,有哪些难点,怎样解决之类的,或是你简历中有其他可供提问的技术等,因人而异了。

总结

问法多种多样,核心原理是一样的。从面试问的题来看,JVM、多线程和数据库是每次都会涉及的东西。另外,有一定名气的公司都会重视基础,无论大小。今后的学习方向还应从实战入手,深入架构原理分析。