一、HashMap和Hashtable区别?
这个一定要去看源码!看源码!看源码!实在看不下去的可以上网看别人的分析。简单总结有几点:
1.HashMap支持null Key和null Value;Hashtable不允许。这是因为HashMap对null进行了特殊处理,将null的hashCode值定为了0,从而将其存放在哈希表的第0个bucket。
2.HashMap是非线程安全,HashMap实现线程安全方法为Map map = Collections.synchronziedMap(new HashMap());Hashtable是线程安全
3.HashMap默认长度是16,扩容是原先的2倍;Hashtable默认长度是11,扩容是原先的2n+1 
 
4.HashMap继承AbstractMap;Hashtable继承了Dictionary
扩展,HashMap 对比 ConcurrentHashMap ,HashMap 对比 SparseArray,LinkedArray对比ArrayList,ArrayList对比Vector
concurrenthashmap  concurrenthashmap不像hashtable那样直接对方法上锁而是采用分段锁(在方法内部的部分使用synchronized关键字)尽可能的把资源放出去。同时最新的cm引入了cas操作。 
arraylist容量   vector通过加synchronized关键字实现线程安全 
二、说一下Java垃圾回收机制?
需要理解JVM,内存划分——方法区、内存堆、虚拟机栈(线程私有)、本地方法栈(线程私有)、程序计数器(线程私有), 理解回收算法——标记清除算法、可达性分析算法、标记-整理算法、复制算法、分代算法,优缺点都理解下。
- jvm内存分为程序计数器,本地方法栈,虚拟机栈(栈帧),方法区(存储常量,类的信息),堆(类对象)
扩展:1.8前后常量池的变化?
1.8之前常量池在方法区当中,但是之后常量池在堆当中 方法区也产生了变化,1。8之前通过jvm内存的永久代实现,但是1.8之后却放入了每个线程的工作内存的元空间当中 
什么对象可以当作gc root?
记住两栈两方法:本地栈,虚拟机栈,方法区的类静态变量(静态全局变量),方法区的类成员变量和成员变量。
1、虚拟机栈中引用的对象
如下代码所示,a 是栈帧中的本地变量,当 a = null 时,由于此时 a 充当了 GC Root 的作用,a 与原来指向的实例 new Test() 断开了连接,所以对象会被回收。 
三、弱引用、软引用区别?
当GC Root指向软引用对象时,在内存不足时,会回收软引用所引用的对象,然而只要发生了gc无论内存足与否都会将虚引用回收。
四、了解过哪些设计模式?(了解,可略过)
1.单例模式:好几种写法,要求会手写,分析优劣。一般双重校验锁中用到volatile,需要分析volatile的原理
2.观察者模式:要求会手写,有些面试官会问你在项目中用到了吗?实在没有到的可以讲一讲EventBus,它用到的就是观察者模式
3.适配器模式:要求会手写,有些公司会问和装饰器模式、代理模式有什么区别?
4.建造者模式+工厂模式:要求会手写
5.策略模式:这个问得比较少,不过有些做电商的会问。
6.MVC、MVP、MVVM:比较异同,选择一种你拿手的着重讲就行。
|