# 阿里一面总结 一面大概 1 个小时(思考怎么回答 + 说废话的时间稍微长一点 -_-),面试官是阿里技术部的。 面试评价: 1. 技术不错,如果后面的面试通过的话会有我的同事联系你; 1. 几点不足: 1. 回答问题时不要有多余的字符,现在大概一个小时了,一般来说是不需要这么长时间的。 1. 回答时不要拓展太多,不然如果深入问的话问不出来东西,会有些影响。 1. 问到的问题不清楚的话不要猜,直接说明即可,不然会把面试引到错误的方向 面试没有自我介绍,直入正题谈项目。以下是面试过程中问到的问题(尽量回忆吧,因为有点激动有些问题可能会漏掉) 面试题基本都是基础,不涉及 GC ,不涉及分布式等。 --- 1. 谈谈你印象最深的一个项目。 1. JSP 和 Servlet 有什么区别? 1. 既然 JSP 会转换成 Servlet, 那为什么要多这一步?直接用 Servlet 不行吗? - JSP 由 HTML 代码和 JSP 标签构成,可以方便地编写动态网页,Servlet 完全是 JAVA 程序代码构成擅长于流程控制和事务处理.因此在实际应用中采用 Servlet 来控制业务流程,而采用 JSP 来生成动态网页. 1. 每一个 request 对应的 Servlet 是直接 new 出来还是只是用同一个? - 如果 request 请求的 Servlet 相同的话不用再 new,如果不同的话需要 new 一个新的。 1. Session 相关的问题问了几个有点乱不太能想起来,这个问题是由之前的回答里面提到 Session 引出来的。 1. Java 集合框架的源码有没有看过? 1. `ArrayList` 和 `linkedList` 底层是怎么实现的?各自的特点是什么? 1. `HashMap` 有没有看过?他是怎么实现的? 1. `HashMap` 是不是线程安全的? 1. 如果我想要用线程安全的 `HashMap` 应该怎么做? 1. 使用 Wrapper,进行一下封装。 1. 使用 `Sychronized` 关键字锁定 `HashMap` 对象。 1. `voliate` 有没有用过?他的原理是什么? 1. 把 `bean` 交给 Spring 管理跟之前直接 `new` 的方式相比有什么好处? - 因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是现实于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有点象USB接口和SCIS硬盘了)。 - 不需要了解实现类的创建方法。普通的 new 的方式需要你清楚的了解实现类的构造,如果在 new 的时候该实现类又又依赖了其他实现类,那需要学习的类就相对比较多了。`bean` 交给 Spring 管理就不需要考虑这些东西,只需要直接获取即可。 1. 编写完配置文件以后我们就可以直接使用 `bean` 了, Spring 是如何做到的? - 首先扫描配置文件,将 `bean` 放入 IOC 容器中,当使用的时候直接从 IOC 中取就可以了。 1. 配置文件扫描 Spring 是如何做到的? 1. 使用专门处理 XML 的库。 1. 你知道 Spring 处理 XML 用的是什么库吗? - `org.xml.sax` 1. 你用过处理 XML 的库吗? - 处理 XML 的库我目前知道的有两种,一种是 java 语言自带的库,另一种是 `JDOM`,我在之前的一个系统中使用过 `JDOM` 来处理连接数据库的配置文件。 1. Spring 是如何获取对象的? - 如果是单例模式的话,这个对象是在 Spring 配置文件扫描以后就直接建立好的,存放在 Map 中,用的时候直接从 Map 中获取。 - 如果不是单例模式,反射调用构造器来 new 一个对象; 1. 处了简历上提到的框架之外有没有用过其他的框架?他们之间有什么不同? 1. 使用 Mybatis 与直接使用 JDBC 的方式相比有什么好处? 1. 最直观的感受就是代码量减少了很多。使用 JDBC 的话需要检查参数,注入参数,从记录转成 Java 对象,使用 Mybatis 的话这些都不用做了,就写一个接口然后在配置文件中写 SQL 即可。 1. 第二点就是 JDBC 中的事务需要手动处理,而使用 Mybatis 的话他会自动就帮你做了。 1. 你知道 Mybatis 的事务是由什么框架实现的吗? 1. Mybatis封装了 `JDBC`,一般情况下事务是由 `JDBC` 来做的。 1. 项目中有没有使用连接池,连接池的原理是什么? 1. 什么样的数据库设计是符合要求的(从范式的角度)? - 理论上说达到第三范式是符合要求的但是一般生产环境下为了数据查询方便,数据会有一定的冗余,也就是说一般达到第二范式即可。 1. 第一范式:字段不可分 1. 第二范式:非主属性必须完全函数依赖于码,即如果码的子集能唯一确定一个非主属性的话,那该表就不符合第二范式。 1. 第三范式:消除了第二范式中的传递函数依赖 1. 给你一个 SQL, 你的同事说这个 SQL 的效率有点低,你会怎么优化? 1. 首先考虑 SQL 本身是否能够优化,如果是多张表直接连接的话那是肯定能够优化的,我们可以把每张表的符合要求的数据通过 `where` 子句查询出来,然后进行连接。 1. 如果是单张表的话 SQL 方面我暂时想不到什么优化的方法,如果要提高效率的话只能通过向表中添加索引的方式来优化。 1. 为什么添加索引能优化查询? 1. 既然索引能优化查询,那我多添加几个索引可不可以?为什么? 1. 如果多个字段设为一个索引 a,b,c,查询的时候只使用 a,b 来查询这样可以吗? - 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 . 1. 连接池中的连接是长连接还是短连接?为什么? 1. 连接池中的连接是基于什么协议的连接?为什么? 1. 怎样建立 TCP 连接,怎样断开 TCP 连接? 1. 为什么要三次握手,为什么要四次挥手? - 如过是两次握手,那么现在有一种情况,客户端向服务器发送了一个 syn 包,但因为网络的原因阻塞在了某一个网络节点,经过一段时间客户端没有收到 syn ack 的包,他肯定是会重传的,之后的过程比较顺利连接成功,数据传输完成并断开后,客户端向服务器端发送的第一个 syn 包到达了服务器,然后服务器发送一个 syn ack 的包,因为这个时候客户端是没有等待这个包的,即使收到了也不会作回应,这是两次握手,那这两次握手后服务器端的资源是释放还是不释放?这是一个问题。 - 四次挥手是因为 TCP 是全双工的,两端能同时向对方发送数据,如果不足四次的话无法确定双方都没有数据发送了。 1. 最近在看什么书?有没有学一些新技术? ## 参考 1. [《深入理解mybatis原理》MyBatis事务管理机制](http://blog.csdn.net/luanlouis/article/details/37992171) 1. [解释一下关系数据库的第一第二第三范式?](https://www.zhihu.com/question/24696366) 1. [MySQL 联合索引详解](http://blog.csdn.net/lmh12506/article/details/8879916) 1. [为什么“三次握手,四次挥手”?](http://www.cnblogs.com/SeaSky0606/p/4741982.html)