Java常见的面试题(一)
一,java数据类型
1,基本数据类型及长度
整型:byte(1),short(2),int(4),long(8)
字符型:char(2)
浮点型:float(4),double(8)
2,引用数据类型
类:String,System,Object,Math.......
接口:Runnable,Serializable,Comparable........
数组:int[],String[],char[].......
二·,springMVC工作流程
(1)用户发送请求至前端控制器DispatcherServlet;
(2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle;
(3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet;
(4)DispatcherServlet 调用 HandlerAdapter处理器适配器;
(5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器);
(6)Handler执行完成返回ModelAndView;
(7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet;
(8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析;
(9)ViewResolver解析后返回具体View;
(10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
(11)DispatcherServlet响应用户。
三,abstract和interface的区别:
(1)abstract类,是单继承,用的是关键字 extends;interface接口,可以多实现,用的关键字是implements
(2)interface内的成员都是public修饰的;而abstract内不一定
(3)interface的成员对象都是static、final修饰的;而abstarct内不一定;
(4)interface内方法不能有默认实现,只有声明;而abstract内只有抽象方法不能有默认实现,其他可以有默认实现
(5)interface被implements时,所有的抽象方法必须被实现;而abstarct类如果有抽象方法,则必须实现该抽象方法,其他的默认实现则继承过来
四,线程、多线程、线程池
线程:进程中负责程序执行的执行单元。一个进程中至少有一个线程。
多线程:解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。
线程池:基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创线 程对象所带来的性能开销,节省了系统的资源。
五,产生死锁的必要条件
产生死锁有四个条件:互斥、请求和保持、不可抢占、循环等待。
只要任意一个条件不成立,死锁就不会发生。
六,HashMap和Hashtable的区别
1、线程安全
Hashtable 是线程安全的,HashMap 不是线程安全的。
2、性能优劣
既然 Hashtable 是线程安全的,每个方法都要阻塞其他线程,所以 Hashtable 性能较差,HashMap 性能较好,使用更广。
如果要线程安全又要保证性能,建议使用 JUC 包下的 ConcurrentHashMap。
3、NULL
Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。
4、实现方式
Hashtable 的继承源码:
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
HashMap 的继承源码:
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
可以看出两者继承的类不一样,Hashtable 继承了 Dictionary类,而 HashMap 继承的是 AbstractMap 类。
Dictionary 是 JDK 1.0 添加的,貌似没人用过这个,栈长我也没用过。。
5、容量扩容
HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。
当现有容量大于总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍,Hashtable 扩容规则为当前容量翻倍 + 1。
6、迭代器
HashMap 中的 Iterator 迭代器是 fail-fast 的,而 Hashtable 的 Enumerator 不是 fail-fast 的。
所以,当其他线程改变了HashMap 的结构,如:增加、删除元素,将会抛出 ConcurrentModificationException 异常,而 Hashtable 则不会。
七,springMVC中Jackson的使用
在springmvc项目中使用ajax的时候,Controller层方法使用@ResponseBody注解,他会返回前端json对象给前端,我们方法只需要返回对象集合,对象,字符串等都可以返回json对象,这个是spring帮我们使用jackson做了
我们只需要在spring中配置jackson即可。