转自http://www.cnblogs.com/xrq730/p/5260294.html
项目经验+基本技术+个人潜力
1.明确你的项目到底是做什么的,有哪些功能
2、明确你的项目的整体架构,在面试的时候能够清楚地画给面试官看并且清楚地指出从哪里调用到哪里、使用什么方式调用
3、明确你的模块在整个项目中所处的位置及作用
4、明确你的模块用到了哪些技术,更好一些的可以再了解一下整个项目用到了哪些技术
专业技能:
一、基本语法
static、final、transient等关键字的作用,foreach循环的原理
Q: static关键字有哪些作用
A:
1.static修饰变量、修饰方法(60分)
2.答出静态块(70分)
3.答出静态内部类(80分)
4.答出静态导包(90分)
volatile关键字的底层实现原理
原则 : 深度优先、广度次之
二、集合
基本上就是List、Map、Set各种实现类的底层实现原理,实现类的优缺点。
要掌握ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理
附加 : 掌握CopyOnWrite容器和Queue
ConcurrentHashMap的问题在面试中问得特别多,大概是因为这个类可以衍生出非常多的问题,
关于ConcurrentHashMap研究方向:
(1)ConcurrentHashMap的锁分段技术
(2)ConcurrentHashMap的读是否要加锁,为什么
(3)ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器
三、设计模式
23种设计模式中重点研究常用的十来种就可以了,面试中关于设计模式的问答主要是三个方向:
(1)你的项目中用到了哪些设计模式,如何使用
(2)知道常用设计模式的优缺点
(3)能画出常用设计模式的UML图
四、多线程
基础 : 怎么实现多线程
深入 : Thread和Runnable的区别和联系、多次start一个线程会怎么样、线程有哪些状态
经典 : 假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?
java.util.concurrent下就有现成的类可以使用。
线程池也是比较常问的一块,常用的线程池有几种?这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的?实际一些的,会给你一些具体的场景,让你回答这种场景该使用什么样的线程池比较合适。
多线程同步、锁这块也是重点。synchronized和ReentrantLock的区别、synchronized锁普通方法和锁静态方法、死锁的原理及排查方法等等
关于多线程,40个Java多线程问题总结。
五、IO
IO分为File IO和Socket IO,记得File IO都是阻塞IO。
Socket IO是比较重要的一块,要搞懂的是阻塞/非阻塞的区别、同步/异步的区别,借此理解阻塞IO、非阻塞IO、多路复用IO、异步IO这四种IO模型,Socket IO如何和这四种模型相关联。深入的话,会问NIO的原理、NIO属于哪种IO模型、NIO的三大组成等等。提一句,NIO并不是严格意义上的非阻塞IO而应该属于多路复用IO,面试回答的时候要注意这个细节,讲到NIO会阻塞在Selector的select方法上会增加面试官对你的好感。
会问Netty,这个框架基本属于当前最好的NIO框架了(Mina其实也不错,不过总体来说还是比不上Netty的),大多数互联网公司也都在用Netty。
六、JDK源码
String的hashCode()方法是怎么实现的。总结一下比较重要的源码:
(1)List、Map、Set实现类的源代码
(2)ReentrantLock、AQS的源代码
(3)AtomicInteger的实现原理,主要能说清楚CAS机制并且AtomicInteger是如何利用CAS机制实现的
(4)线程池的实现原理
(5)Object类中的方法以及每个方法的作用
七、框架
会问项目中使用的框架,给场景问用框架怎么做,比如我想要在Spring初始化bean的时候做一些事情该怎么做、想要在bean销毁的时候做一些事情该怎么做、MyBatis中$和#的区别等等。
面试官会深入问框架的实现原理。问得最多的就是Spring AOP的实现原理。让画Spring的Bean工厂实现的UML图.
八、数据库
基本的像union和union all的区别、left join、几种索引及其区别就不谈了,比较重要的就是数据库性能的优化,建议看SQL基础和SQL优化。
九、数据结构和算法分析
数组、链表是基础,栈和队列深入一些但也不难,树挺重要的,比较重要的树AVL树、红黑树,可以不了解它们的具体实现,但是要知道什么是二叉查找树、什么是平衡树,AVL树和红黑树的区别。聊到了数据库的索引,问:
你知道索引使用的是哪种数据结构实现吗?
你知道为什么要使用树吗?答到因为Hash表可能会出现比较多的冲突,在千万甚至是上亿级别的数据面前,会大大增加查找的时间复杂度。而树比较稳定,基本保证最多二三十次就能找到想要的数据,对方说不完全对.
你们觉得索引为什么要使用树来实现呢?
记得某次面试对方问我,Collections.sort方法使用的是哪种排序方法。可以去看一下Collections.sort方法的源代码,用TimSort的排序法,也就是增强型的归并排序法。
十、Java虚拟机
周志明老师的《深入理解Java虚拟机:JVM高级特性与最佳实践》
谈谈Java虚拟机中比较重要的内容:
(1)Java虚拟机的内存布局
(2)GC算法及几种垃圾收集器
(3)类加载机制,也就是双亲委派模型
(4)Java内存模型
(5)happens-before规则
(6)volatile关键字使用规则
十一、Web方面的一些问题
Java主要面向Web端,因此Web的一些问题也是必问的。问得最多的两个问题是:
谈谈分布式Session的几种实现方式 常用的四种能答出来自然是让面试官非常满意的
另外一个常问的问题是:
讲一下Session和Cookie的区别和联系以及Session的实现原理
web.xml里面的内容是重点,Filter、Servlet、Listener,至少能对它们的使用知根知底。另外,一些细节的方面比如get/post的区别、forward/重定向的区别、HTTPS的实现原理也都可能会被考察到。
一致性Hash算法被问到了几次。文章是MemCache超详细解读和对一致性Hash算法,Java代码实现的深入研究。
最后,建议学习、研究一下SOA和RPC,面向服务体系,大型分布式架构必备。