一、算法和数据结构
★什么时候该用数组型容器、什么时候该用链表型容器?
★什么是散列函数?HashMap的实现原理是什么?
★什么是递归?如果你以前从来没写过递归函数,尝试着写一个(比如用递归函数进行目录树遍历)。
★什么是算法复杂度?
★你是否理解空间换时间的思想?
★写一个针对整数数组的冒泡排序函数,看看你要修改几次才能跑通。
★写一个针对整数数组的二分查找函数,看看你要修改几次才能跑通。
二、面向对象的基本功
★基于接口的继承和基于实现的继承各有什么优点、缺点?
★继承(包括extend和implement)有什么缺点?
★多态(polymorphism)有什么缺点?
★为什么Java可以多继承interface,而不可以多继承class?
★假如让你写一个小游戏(比如人机对战的五子棋),你会如何设计类结构?
★类结构设计时,如何考虑可扩展性?
三、JVM
★关于基本类型和引用类型
Java的基本类型和引用类型在本质上有什么区别。
◇这两种类型在内存存储上有什么区别?
◇这两种类型在性能上有什么区别?
◇这两种类型对于GC有什么区别?
★关于垃圾回收(Garbage Collection)
GC的实现机制。请看如下的问题:
◇GC是如何判断哪些对象已经失效?
◇GC对性能会有哪些影响?
◇如何通过JVM的参数调优GC的性能?
★关于字符串
对于Java提供的String和StringBuilder(StringBuffer),想必很多人都知道:String用于常量字符串,StringBuilder用于可变字符串。那Java当初为什么要这样设计?为啥不用一个类来统一搞定?
★关于范型(Generic Programming)
从JDK 1.5开始,Java引入了一个重量级的语法:范型。不过,很多仅仅知道范型的皮毛,而对于很多本质的东东,不甚了解。
◇GP是在编译时实现的还是在运行时实现的?为什么要这么实现?
◇GP的类型擦除机制是咋回事?有啥优点/缺点?
◇使用范型容器(相对于传统容器)在性能上有啥影响?为什么?
★关于多线程
几个关于多线程的问题。
◇synchronized关键字是怎么起作用的?
◇synchronized的颗粒度(或者说作用域)如何?是针对某个类还是针对某个类对象实例?
◇synchronized对性能有没有影响?为什么?
◇volatile关键字又是派啥用的?啥时候需要用这个关键字?