模拟面试题回顾
1.servlet里面有哪些关键的方法?
讲到它的方法,就不可避免地去了解servlet的运行过程(也可以说是生命周期),如下图所示:
它的四个过程:
(1).当客户端第一次发送请求后,由容器(Web服务器Tomcat)解析请求,并根据请求找到对应的servlet,判断该类的对象是否存在,不存在则创建servlet实例;
(2).调取init()方法 进行初始化操作;
(3).初始化完成后调取service()方法,由service()判断客户端的请求方式,如果是get,则执行doGet(),如果是post则执行doPost().处理方法完成后,作出相应结果给客户端.单次请求处理完毕;
(4).服务终止或继续。
- 如只发送单次请求,就会终止服务,调取destory()方法进行销毁。
- 如再次发送请求,仍然会判断该类对象是否存在,就不再执行init()方法(初始化)了,就直接调service方法或者doGet()、doPost()方法。
2.mvc模式在处理业务逻辑时应该放到哪一层?
这就得涉及到mvc这个设计模式(它不属于java里的23种设计模式),以及与三层架构的关系。
- 首先是MVC:
能够看出来它和页面关联性比较强。
- 涉及到了业务逻辑,就再进一步看看它与三层架构之间的关系:
MVC主要应用于表现层(UI),对于表现层,有实体、控制器、视图三个部分去实现,控制器完成页面逻辑,控制层和逻辑业务层(Bill)相关联,实体来关联具体数据。所以说MVC可以一个是表现层框架。
3.integer a =127 , 再new 一个 integer ,用“==”相关联会输出什么呢?
输出的是true,
原因:
- 对于整型变量,jvm在[-128,127]
是使用同一个地址(也就是说自动装箱时不会new新的Integer对象),超出了这个范围就使用不同的地址了。而127刚好在这个范围内,是同一个地址,同一个对象,所以输出是true的。 - 也就是说,这些范围内的相同值对应同一个对象 ,所以引用符号也是一样的
4.逻辑与(&&)和逻辑或(||)的短路?
短路运算符就是从左到右的运算中前者满足要求,就不再执行后者了; 可以理解为:
-
&&为取假运算,从左到右依次判断,如果遇到一个假值(也可以说是不成立),就返回假值,以后不再执行,否则返回最后一个真值;
-
|| 为取真运算,从左到右依次判断,如果遇到一个真值,就返回真值,以后不再执行,否则返回最后一个假值。
5.string 为什么会被设置成不可变的对象 ?
首先是String的源码:
public final class String implements Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */
private final char[] value;/** Cache the hash code for the string */
private int hash;// Default to 0
可以看出这是一个由final限制的char数组。
然后原因:
- 便于实现字符串池;(String常量在java中用的很多,不可变时就可以实现由String pool池去引用已存在的字符串,就可以极大地避免空间浪费)
- 使多线程安全;(不可变可以保证在多线程下不能被写,这样就保证线程安全)
- 避免安全问题;(网络连接地址,文件路径,反射机制都和String参数离不开,一旦可变,其网络连接会极大地受到影响)
- 加快字符串处理速度。
详细请见该文
6.有序的集合有哪些?
List、LinkedHashMap、LinkedHashSet、TreeMap、TreeSet是有序的,
List、LinkedHashMap、LinkedHashSet、LinkedHashSet在遍历时会保持添加的顺序,
TreeMap、TreeSet在遍历时会以自然顺序(Comparable接口的compareTo)输出
7.一个线程调用start方法和run方法有什么区别?
调用线程的 start() 方法后,线程处于可运行状态,此时它可以由 JVM 调度并执行,这并不意味着线程就会立即运行
run() 方法是线程运行时由 JVM 回调的方法,无需手动写代码调用
直接调用线程的 run() 方法,相当于在调用线程里继续调用方法,并未启动一个新的线程