前言:
接着《Java 面试题 - 01》, 继续聊聊剩下的内容.
一, Javaweb 高级:
1. 什么叫监听器(listener)?
答: 监听器主要是用来监听特定对象的创建或销毁, 属性的变化的, 是一个实现特定接口的普通 java 类. 具体实现哪个接口, 要看你监听什么内容, 比如要监听 Request 对象的创建或销毁, 就实现 ServletRequestListener 接口. 它是随 Web 应用的启动而启动, 只初始化一次, 随 Web 应用的停止而销毁.
2. 什么叫过滤器(filter)?
答: 就是对 servlet 请求起到过滤的作用, 它在监听器之后, 作用在 servlet 之前. 比如编码过滤器, 就是经过了该过滤器的请求都会设置成过滤器中指定的编码. 过滤器是随 Web 应用启动而启动, 只初始化一次, 只有当 Web 应用停止或重新部署的时候才销毁.
3. 什么叫拦截器(interceptor)?
答: 拦截器类似于 fileter , 也是拦截用户的请求. 不同的是, 它不需要在 Web.xml 中配置, 不随 Web 应用的启动而启动, 是基于 JAVA 的反射机制和动态代理实现的. 只有调用相应的方法时才会调用, 在面向切面编程中应用的.
4. servlet 请求的执行过程是怎样的?
答: 过程是这样的: context-param(初始化配置) --> listener --> filter --> servlet --> interceptor --> 页面.
5. 谈谈你对 Ajax 的认识.
答: Asynchronous JavaScript and xml 的缩写, 是一种创建交互式网页应用的的网页开发技术. 通过异步提交的方式, 可以实现局部刷新, 在不更新整个页面的前提下维护数据, 提升用户体验度.
二, 数据库:
1. select 语句的执行顺序怎样的?
答: SQL 语言不同于其他编程语言的最明显特征是处理代码的执行顺序. 在大多数据库语言中, 代码按顺序执行, 但是 SQL 语言执行顺序如下:
from --> where --> group by 分组 --> 聚合函数 --> having 筛选分组 --> 计算所有的表达式 --> select 的字段 --> order by 排序.
2. 你知道聚合函数吗?
答: 聚合函数是对一组值进行计算并返回单一的值的函数, 它经常与 select 语句中的 group by 子句一同使用. 比如求平均值的聚合函数是 avg().
3. 你知道连接查询吗?
答: 连接查询分为内连接和外连接, 内连接显示表之间有连接匹配的所有行. 外连接又分为左外连接, 右外连接和全连接. 左外连接就是以左表作为基准进行查询, 左表数据会全部显示出来, 右表如果和左表匹配的数据则显示相应字段的数据, 如果不匹配则显示为 null. 右连接是以右表作为基准进行查询, 右表数据会全部显示出来, 左表如果和右表匹配的数据则显示相应字段的数据, 如果不匹配则显示为 null. 全连接是先以左表进行左外连接, 再以右表进行右外连接.
4. 事务有几大特性? 分别是什么?
答: 事务有四大特性, ACID.
原子性(A): 整个事务中的所有操作, 要么全部完成, 要么全部不完成.
一致性(C): 在事务开始之前和事务结束以后, 数据库的完整性约束没有被破坏.
隔离性(I): 如果有两个事务, 运行在相同的时间内, 执行 相同的功能, 事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统.
持久性(D): 在事务完成以后, 该事务所对数据库所作的更改便持久的保存在数据库之中, 并不会被回滚.
5. MySQL 中的四种隔离级别是什么?
答: 四种隔离级别如下:
读未提交(READ UNCOMMITTED): 未提交读也叫读脏, 就是事务可以读取其它事务未提交的数据.
读已提交(READ COMMITTED): 读已提交就是在事务未提交之前所做的修改其它事务是不可见的. 在其它数据库系统比如 SQL Server 默认的隔离级别就是读已提交.
可重复读(REPEATABLE READ): 保证同一个事务中的多次相同的查询的结果是一致的, 比如一个事务一开始查询了一条记录然后过了几秒钟又执行了相同的查询, 保证两次查询的结果是相同的, 可重复读也是 MySQL 的默认隔离级别.
可串行化(SERIALIZABLE): 可串行化就是保证读取的范围内没有新的数据插入, 比如事务第一次查询得到某个范围的数据, 第二次查询也同样得到了相同范围的数据, 中间没有新的数据插入到该范围中.
6. 对于 MySQL 性能优化, 你知道多少?
答: 我知道的有以下几点:
当只要一行数据时使用 limit 1 . 查询时如果已知会得到一条数据, 这种情况下加上 limit 1 会增加性能. 因为 MySQL 数据库引擎会在找到一条结果停止搜索, 而不是继续查询下一条是否符合标准直到所有记录查询完毕.
选择正确的数据库引擎 .MySQL 中有两个引擎, MyISAM 和 InnoDB, 每个引擎有利有弊. MyISAM 适用于一些大量查询的应用, 但对于有大量写功能的应用不是很好. InnoDB 是一个非常复杂的存储引擎, 对于一些小的应用会比 MyISAM 还慢, 但是在写操作比较多的时候会比较优秀. 并且, 它支持很多的高级应用, 例如: 事物.
用 not exists 代替 not in .Not exists 可以使用索引, not in 不能使用索引. 在数据量比较大的操作中不建议使用 not in 这种方式.
对操作符的优化. 尽量不采用不利于索引的操作符 , 如: in not in is null is not null <> 等 .
limit 的基数比较大时使用 between .
例如: select * from admin order by admin_id limit 100000,10
优化为: select * from admin where admin_id between 100000 and 100010 order by admin_id.
尽量避免在列上做运算, 这样导致索引失效 .
例如: select * from admin where year(admin_time)>2014
优化为: select * from admin where admin_time> '2014-01-01′
三, 框架篇:
(一),Spring
1. 谈谈你对 spring 的理解.
答: Spring 是一个轻量的开源框架, 为简化企业级应用开发而生, 它的核心如下:
控制反转(IoC): 传统的 java 开发模式中, 当需要一个对象时, 我们会自己使用 new 或者 getInstance 等直接或者间接调用构造方法创建一个对象. 而在 spring 开发模式中, spring 容器使用了工厂模式为我们创建了所需要的对象, 不需要我们自己创建了, 直接调用 spring 提供的对象就可以了, 这就是控制反转的思想. 控制反转是一种思想, 而不是一种技术.
依赖注入(DI):,spring 使用 javaBean 对象的 set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值, 这就是依赖注入的思想. 依赖注入就是使用了控制反转这种思想的一种技术.
面向切面编程 (AOP): 在面向对象编程(oop) 思想中, 我们将事物纵向抽成一个个的对象. 而在面向切面编程中, 我们将一个个的对象某些类似的方面横向抽成一个切面, 对这个切面进行一些如权限控制, 事物管理, 记录日志等公用操作处理, 这就是面向切面编程的思想. AOP 底层是动态代理, 如果是接口采用的是 JDK 动态代理, 如果是类采用的是 CGLIB 方式实现动态代理.
2. 你知道 spring 框架中使用了哪些设计模式吗?
答: spring 中使用到的部分设计模式如下:
单例模式: 在 spring 的配置文件中设置 bean 默认为单例模式.
模板方法模式: 用来解决重复代码, JpaTemplate ,RedisTemplate 等.
前端控制器模式: spring 提供了前端控制器 DispatherServlet 来对请求进行分发.
工厂模式: Spring 中使用 beanFactory 来创建对象的实例, 就是用的工厂模式.
3. 介绍一下 spring bean 的生命周期.
答: bean 的生命周期为 创建 --> 初始化 --> 调用 --> 销毁.
4. 说一说 spring 有哪些核心模块?
答: 主要有以下七大核心模块:
七大核心模块
Core 模块: 封装了框架依赖的最底层部分, 包括资源访问, 类型转换及一些常用工具类.
Context 模块: 以 Core 和 Beans 为基础, 集成 Beans 模块功能并添加资源绑定, 数据验证, 国际化, Java EE 支持, 容器生命周期, 事件传播等, 核心接口是 ApplicationContext.
AOP 模块: 面向切面编程, 通过配置管理特性, spring AOP 直接将面向切面的编程集中到了框架中, 所以可以很容易使 spring 管理的对象支持 AOP.
ORM 模块: Spring 的 ORM 模块提供了对常用 ORM 框架如 Hibernate,Mybaties 等的辅助和支持, 他本身更并不实现 ORM, 仅仅对常见的 ORM 框架进行封装并对其进行管理.
DAO 模块: 通常编写数据库代码时总要写一些样板似的内容, 如获取连接, 创建语句, 释放连接等 ,Dao 模块将这些模板抽象出来, 使得数据库代码变得简单明了, 也可以避免因为释放数据库资源失败而导致的问题.
Web 模块: 提供了基本的面向 Web 的集成功能, 例如多个文件的上传功能, 使用 servlet 监听器, 面向 Web 应用程序的上下文来初始化 IoC 容器, 还实现了 springMVC.
Web MVC 模块: 该模块为 spring 提供了一套轻量级的 mvc 实现, 他还可以支持和管理其他的 mvc 框架, 如 struts. 相对于 struts,spring 自己的 mvc 框架更加简洁和方便.
5. 请描述一下 spring 的事务.
答: Spring 既支持编程式事务管理(也称编码式事务), 也支持声明式的事务管理. 编程式事务就是把事务写在业务逻辑代码中, 声明式事务是将事务管理代码从业务方法中分离出来, 以声明的方式来实现事务管理. 大多数情况下比编程式事务管理更好用. 声明式事务可以在配置文件中用 < tx > 标签来实现, 也可以在需要使用事务的方法上加 @Transaction 注解.
6. 如何理解 spring 的 IoC 容器?
答: IoC 就是控制反转, 这是一种思想而不是一种技术. 通常创建对象是由程序员来 new 的, 而 "控制反转" 是指 new 实例的工作不由程序员来做, 而是交给 Spring 容器来做. 在 Spring 中 BeanFactory 是 IoC 容器的实际代表者.
7. ApplicationContext 是干嘛的? 有哪些实现类?
答: ApplicationContext 是 "应用容器", 继承自 BeanFactory.Spring 把 Bean 放在这个容器中, 在需要的时候, 用 getBean 方法取出. 它的实现有以下三个:
FileSystemXmlApplicationContext : 从指定的文件系统路径中寻找指定的 xml 配置文件, 找到并装载完成 ApplicationContext 的实例化工作.
ClassPathXmlApplicationContext: 从类路径 ClassPath 中寻找指定的 xml 配置文件, 找到并装载完成 ApplicationContext 的实例化工作.
XmlWebApplicationContext: 从 Web 应用中寻找指定的 xml 配置文件, 找到并装载完成 ApplicationContext 的实例化工作.
8. BeanFactory 与 AppliacationContext 有什么区别?
答: BeanFactory 是基础类型的 IoC 容器, 提供完整的 IoC 服务支持. ApplicationContext 是在 BeanFactory 的基础上构建, 是相对比较高级的容器, 除了 BeanFactory 的所有支持外, ApplicationContext 还提供了事件发布, 国际化支持等功能.
9. 依赖注入有哪些实现方式?
答: spring 提供了以下四种依赖注入的方式:
使用 Set 方法注入
使用构造方法注入
使用静态工厂注入
使用实例工厂注入
10. 什么是 spring beans?
答: spring beans 就是被 spring 容器初始化, 配置和管理的对象.
11. 一个 spring beans 的定义需要包含什么?
答: 一个 Spring Bean 的定义包含容器必知的所有配置元数据, 包括如何创建一个 bean, 它的生命周期详情及它的依赖.
12. spring 支持几种类的作用域?
答: spring 在配置 bean 的时候, 可以通过 scope 属性来定义作用域, scope 属性有以下 5 个值:
singleton : bean 在每个 Spring IoC 容器中只有一个实例. 默认就是 singleton, 它是线程不安全的.
prototype: 每一次请求都会产生一个新的 bean 实例.
request:request 表示针对每一次 HTTP 请求都会产生一个新的 bean, 同时该 bean 仅在当前 HTTP request 内有效.
session: 作用域表示针对每一次 HTTP 请求都会产生一个新的 bean, 同时该 bean 仅在当前 HTTP session 内有效.
global session: 作用域类似于标准的 HTTP Session 作用域, 不过它仅仅在基于 portlet 的 Web 应用中才有意义.
13. 怎么开启 spring 的注解装配?
答: spring 默认是没有开启注解的, 要使用注解, 我们必须在 Spring 配置文件中配置 <context:annotation-config/>元素.
14. 简单的说一下 AOP 编程中的相关概念.
答: 主要有如下概念:
Joinpoint(连接点) : 类里面可以被增强的方法, 这些方法称为连接点 .
Pointcut(切入点): 在哪些类的哪些方法上切入(where).
Advice(通知 / 增强) : 拦截到 Joinpoint 之后所要做的事情就是通知. 通知分为前置通知, 后置通知, 异常通知, 最终通知, 环绕通知.
Aspect(切面) : 切面 = 切入点 + 通知, 通俗点就是: 在什么时机, 什么地方, 做什么增强.
Weaving(织入) : 把切面加入到对象, 并创建出代理对象的过程.(由 Spring 来完成).
Target(目标对象) : 需要增强的类就是目标对象.
Proxy(代理) : 一个类被 AOP 织入增强后, 就产生一个代理类.
(二),SpringMVC
1. 什么是 springMVC?
答: Spring MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架. 使用了 MVC 架构模式的思想, 将 Web 层进行职责解耦, 基于请求驱动指的就是使用请求 - 响应模型. 框架的目的就是帮助我们简化开发.
2. 简单描述一下 SpringMVC 的工作原理.
答: 工作原理如下:
用户向服务器发送请求, 请求被 springMVC 前端控制器 DispatcherServlet 捕获;
由 DispatcherServlet 控制器找到处理请求的 Controller;
DispatcherServlet 将请求提交到 Controller;
Controller 调用业务逻辑处理后, 返回 ModelAndView 给 DispatcherServlet;
DispatcherServlet 查询一个或多个 ViewResoler 视图解析器, 找到 ModelAndView 指定的视图;
ViewResoler 解析出 ModelAndView()中的参数, 将视图返回给客户端; .
3. springMVC 有什么优点?
答: 它是基于组件技术的, 全部的应用对象, 无论控制器和视图, 还是业务对象之类的都是 java 组件; 可以任意使用各种视图技术, 而不仅仅局限于 JSP; 支持各种请求资源的映射策略; 它应是易于扩展的.
4. springMVC 和 struts2 有什么区别?
答: 区别如下:
springmvc 的入口是一个 servlet 即前端控制器(DispatcherServlet), 而 struts2 入口是一个 filter 过虑器(StrutsPrepareAndExecuteFilter).
springmvc 是基于方法开发(一个 url 对应一个方法), 请求参数传递到方法的形参, 可以设计为单例或多例(建议单例),struts2 是基于类开发, 传递参数是通过类的属性, 只能设计为多例.
Struts 采用值栈存储请求和响应的数据, 通过 OGNL 存取数据, springmvc 通过参数解析器是将 request 请求内容解析, 并给方法形参赋值, 将数据和视图封装成 ModelAndView 对象, 最后又将 ModelAndView 中的模型数据通过 reques 域传输到页面.
未完待续......
来源: http://www.jianshu.com/p/d613d087e1d8