java面试总结2
原创
©著作权归作者所有:来自51CTO博客作者咪哥杂谈的原创作品,请联系作者获取转载授权,否则将追究法律责任
java面试总结2
今天又去了一家公司面试,别的不说单说技术,个人觉得早已超出了实习水平的问答了,难道这是和公司的规模有关系吗?但是同时这也让我意识到了自己还有需要要学习的和基础部分的不足。
虽然问题问的很繁琐,但是还是要总结一下,毕竟有些问题还是挺有意义的。
1.画出集合方面的图:
Collection接口
丨------List接口:存储有序,可以重复的元素
丨-------ArrayList(主要的实现类,首选)
丨-------LinkedList(频繁的插入,删除)
丨-------Vector(古老的实现类,线程安全)
丨------Set接口:存储无序,不可重复的元素,Set中常用的方法都是Collection下定义的
丨-------HashSet(主要实现类)
丨-------LinkedHashSet
丨-------TreeSet
Map接口,存储“键-值”对的数据:
丨------HashMap、LinkedMap、TreeMap、Hashtable(子类:Properties)
1.1 其中HashMap的key怎么保证唯一性的?
*1.key是用Set来存放的,不可重复,value是用Collection来存放的,可重复 一个key-value对,是一个Entry,所有的Entry是用Set存放的,也是不可重复的。
*2.向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同,若相同则只能够添加进一个,则只能添加进后加的那个元素。
2. 请你写出jdbc重要的部分,同时写出LinkedList。。。。(这里压根就没看过LinkedList源码。。)
jdbc的连接实例:
import java.sql.*;
public class FirstExample {
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/EMP";
// Database credentials
static final String USER = "username";
static final String PASS = "password";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try{
//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");
//STEP 3: Open a connection
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
//STEP 5: Extract data from result set
while(rs.next()){
//Retrieve by column name
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
//Display values
System.out.print("ID: " + id);
System.out.print(", Age: " + age);
System.out.print(", First: " + first);
System.out.println(", Last: " + last);
}
//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();
}catch(SQLException se){
//Handle errors for JDBC
se.printStackTrace();
}catch(Exception e){
//Handle errors for Class.forName
e.printStackTrace();
}finally{
//finally block used to close resources
try{
if(stmt!=null)
stmt.close();
}catch(SQLException se2){
}// nothing we can do
try{
if(conn!=null)
conn.close();
}catch(SQLException se){
se.printStackTrace();
}//end finally try
}//end try
System.out.println("Goodbye!");
}//end main
}//end FirstExample
LinkedList源码:这里抽时间好好总结一下,因为不是一两句就可以说清楚的(此处保留)
3.SpringMVC流程图,请你画一下
4.
当你客户端的cookie被禁用了,那么session还能起作用吗?
答:
作者:林灿斌
大致原理就是储存一个独一无二的用户令牌(这里暂且称为SessionID吧)和令牌对应的用户数据,例如这样:
SessionID | UserID
1A6B78E7 | 195
B6SE3C66 | 0 (默认,未登陆状态)
E135C338 | 131 (用户将账号密码验证码和SessionID发回服务器后,将UserID改为用户主键值)
客户端要实现Session就需要从服务端获取一个SessionID(服务端可以用一个meta tag把SessionID发到客户端,客户端用js获取,方法简直不要太多),永久性或半永久性地保存在本地(起码不能再开一次网页,会话就没了),每次访问需要Session的页面,就将SessionID发出。
想到这里,难点就只有两个了,保存和发送。主要难点是前者。
前面有人提到的URL传参但没有提到保存方式,永久性或半永久性地储存,除了Cookie外还有什么呢?Etag单页有效并且缓存容易被冲掉,想了想,HTML5新增的LocalStorage就可实现近乎永久性的保存。(IE 8+)
解决了客户端接收和储存这个问题,那么发出SessionID就简单了:
1、前端模板实现的全异步网站,在需要SessionID的请求时,使用:
xhr.setRequestHeader(‘X-SessionID-Header’, ‘B6SE3C66’);
这样就实现了SessionID的收发。
2、非异步网站,粗暴的做法可以让JS可以遍历所有a标签,判断host,如果非跨域,则为其href指向链接追加SessionID参数,同样实现了收发。当然也还有更加精细的做法。
LocalStorage虽然不如Cookie方便,相对于Cookie来说也是有一定好处的,同域的所有页面请求都会附加上同个Cookie,这会影响加载速度,很多网站的静态资源都另外使用了一个域名一部分原因就是这个。LocalStorage的令牌发送是可控的,Cookie的发送是不可控的。
5.Servlet创建以后能实例几个对象?
servlet 只有一个实例,具有生命周期 即:
①.初始化阶段 调用init()方法
②.响应客户请求阶段调用service()方法
③.终止阶段调用destroy()方法
6.Spring MVC中哪个工具可以解析json?
7.JSP和EL中用的内置对象?
JSP:
对象名 类型 作用域
request javax.servlet.ServletRequest RequestScope
response javax.servlet.ServletResponse PageScope
pageContext javax.servlet.jsp.PageContext PageScope
session javax.servlet.http.HttpSession SessionScope
application javax.servlet.ServletContext ApplicationScope
out javax.servlet.jsp.JspWriter PageScope
config javax.servlet.ServletConfig PageScope
page java.lang.Object PageScope
exception javax.lang.Throwable PageScope
JSP EL的内置对象:
pageContext
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
cookie
initParam