面试题整理

面试题

1.请说一下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响应用户。

客户端发送请求-> 前端控制器 DispatcherServlet 接受客户端请求 -> 找到处理器映射 HandlerMapping 解析请求对应的 Handler-> HandlerAdapter 会根据 Handler 来调用真正的处理器来处理请求,并处理相应的业务逻辑 -> 处理器返回一个模型视图 ModelAndView -> 视图解析器进行解析 -> 返回一个视图对象->前端控制器 DispatcherServlet 渲染数据(Moder)->将得到视图对象返回给用户.

2.请说一下#{}和${}的区别

#{}是预编译处理,${}是字符串替换。

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

Mybatis在处理${}时,就是把 ${} 替换成变量的值。调用Statement来赋值

使用#{}可以有效的防止SQL注入,提高系统安全性。

3.请说一下spring的ioc和di

IOC:控制反转,指将对象的创建,对象的存储,对象的管理交给了spring容器

即“控制反转”,是一种设计思想,是指创建对象的控制权的转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到容器,对象与对象之间松散耦合,也利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。DI(依赖注入)和控制反转是同一个概念的不同角度描述,所谓依赖注入就是应用程序依赖于IoC容器,在运行时需要IoC容器来动态提供对象需要的外部资源。

Java中依赖注入有以下三种实现方式:构造器注入、Setter方法注入、接口注入。

4.谈一谈restful风格

1)Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件,基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存机制等。

2)简化请求参数

3)通过请求方式执行完成不同的业务,post 创建数据、get获取数据、put和patch修改数据、delete删除数据。

4)url中尽量使用名词,restful也可以称为“面向资源编程”

5) 如果使用单个值做参数,必须添加@PathVariable注解

5.关于lombok面试题

1)需要在IDEA中安装对应的插件 “红番椒”

2)添加jar包 之后通过注解进行调用!!!

问题: 项目将来都要部署到Linux系统中. 是否需要安装插件??? 对java编译的规则是否清楚!!!

答案: 不需要安装

原因: lombok在编译期有效 xxx.java(源码) ----jvm-----xxxx.class(字节码文件) ----xxx.jar

6.什么是ORM

ORM,即Object-Relational Mapping(对象关系映射),它的作用是

在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作

业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。

7.MyBatisPlus执行流程

1).通过注解 实现对象与表一一映射.

2).通过属性注解 实现对象的属性与表中的字段一一映射.

3).将公共的方法进行抽取,抽取到BaseMapper接口中

4).将用户操作的方法对象,转化为数据库能够识别的Sql语句.

demo1: userMapper.insert(user对象)

Sql1: insert into 表名(字段名…) value (属性值…)

拼接过程:

insert into 表名(字段名…) value (属性值…)

1). 通过userMapper 查找父级接口BaseMapper

2). 根据BaseMapper 查找泛型对象 User对象.

3).根据user对象 查找指定的注解 @TableName,获取表名

4).根据user对象的属性,动态获取表中的字段.@TableField

5).在获取字段的同时,获取属性的值,最后进行sql拼接

6).MP将拼接好的Sql交给Mybatis框架处理执行.

insert into demo_user(id,name…) value (value1,value2…)

8.ajax执行原理

Ajax的工作原理相当于在用户和服 务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化。

并不是所有的用户请求都提交给服务器,像—些数据验证和数据处理等都交给 Ajax引擎自己来做, 只有确定

需要从服务器读取新数据时再由Ajax引擎代为向服务器提交请求。

9.谈一下同源策略

概念: 要求请求协议://域名:端口号都相同.

说明: 浏览器解析页面时,当页面中有ajax请求时,则要求页面的URL地址,与Ajax请求的地址必须满足同源

策略的规范.

同源策略:

请求协议 http:// https://

请求域名

请求的端口**

上述的三项必须相同. 满足同源策略.浏览器可以解析数据,否则不能正常解析

案例练习1:

URL: http://www.jd.com/xxx/xxx

Ajax: https://www.jd.com/xxx/xxx/xxx 协议不同

案例练习2:

URL: http://www.jd.com:80/xxx/xxx 满足要求

Ajax: http://www.jd.com:80/xxx/xxx/xxx

案例练习3: IP与域名对应

URL: http://www.jd.com:80/xxx/xxx 不满足要求 域名不同

Ajax: http://10.0.0.6:80/xxx/xxx/xxx

案例练习4:

URL: http://www.jd.com/xxx/xxx 不满足要求 域名不同

Ajax: http://www.jt.com/xxx/xxx/xxx

10.什么是AOP,原理是什么

1)AOP=Aspect Oriented Programming(面向切面编程),简单理解:在不影响源代码的基础上对代码进行增强

2)AOP 实际上是由目标类的代理类实现的。AOP 代理其实是由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用。AOP 代理包含了目标对象的全部方法,但 AOP 代理中的方法与目标对象的方法存在差异,AOP方法在特定切入点添加了增强处理,并回调了目标对象的方法。

//

1.连接点(Joint point)表示在程序中明确定义的点:就是方法的调用就称为连接点

2.切入点(Pointcut)表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。

简单理解:符合某种规则的连接点

连接点包含切入点,切入点一定是连接点,连接点不一定是切入点

3.通知Advice:Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。

简单理解:advice是增强的方法

4.切面(Aspect)Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。

简单理解:狭义上的切面:一个类包含了增强的方法,和指定的规则

广义上的切面=连接点+切入点+通知

5.目标对象(target object):被增强的对象

织入(weaving):通过动态代理增强指定的方法

切面:拦截器类,其中会定义切点以及通知

切点:具体拦截的某个业务点。

通知:切面当中的方法,声明通知方法在目标业务层的执行位置,通知类型如下:

前置通知:@Before 在目标业务方法执行之前执行,可以有参数也可以没有参数

可以指定连接点的参数,通过该参数可以获取目标对象和目标方法等相关信息,如果通知有多个参数时连接点参数必须放到第一个

后置通知:@After 在目标业务方法执行之后执行

返回通知:@AfterReturning 在目标业务方法返回结果之后执行

异常通知:@AfterThrowing 在目标业务方法抛出异常之后

环绕通知:@Around 功能强大,可代替以上四种通知,还可以控制目标业务方法是否执行以及何时执行

环绕通知的作用

1.控制目标方法是否被执行

2.控制是否有返回值

改变返回值(不推荐)

注意:面试时尽量答的越全面越好(前提是正确的前提)

11.ArrayList和LinkedList的区别

1).数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。

2).随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据

存储方式,所以需要移动指针从前往后依次查找。

3).增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList

增删操作要影响数组内的其他数据的下标。

综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推

荐使用 LinkedList。

12.HashSet的原理

1)不能保证元素的顺序,元素是无序的

2)集合元素值允许为null在这里插入代码片

3)HashSet不是同步的,需要外部保持线程之间的同步问题

13.Throw和Thrwos的区别

1)位置不同,throw在方法内部,throws在方法声明处

2)后面的内容不同,throw后跟的是异常对象,throws后跟异常类

3)后面个数不同,throw后面只能跟一个异常对象,throws后面可以跟多个异常类

14.多线程的实现方式

1)继承Thread类

2)实现Runnable接口

3)实现Callable接口

15.sleep和wait的区别

1)sleep()不释放锁,wait()释放锁

2)sleep()在Thread类中声明的,wait()在Object类中声明

3)sleep()是静态方法,是Thread.sleep()

 wait()是非静态方法,必须由“同步锁”对象调用

4)sleep()方法导致当前线程进入阻塞状态后,当时间到或interrupt()醒来

 wait()方法导致当前线程进入阻塞状态后,由notify或notifyAll()

16.常见的设计模式

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

还有两类:并发型模式和线程池模式

17.冒泡排序,选择排序等等

冒泡排序法,满足两个要求
(1) a[0]跟a[1]比,a[1]跟a[2]比,a[2]跟a[3]比,a[3]跟a[4]比
(2) 两个元素相比,如果左边大于右边,则交换位置,不大,则不换

冒泡排序法的特点是:先在几个数中选出最大的,然后把这个最大的拿走,在剩下的几个数中再选
出最大,再拿走,依次这样选。最后,将所有选出的最大的左到右排出来。

冒泡排序法思路

1:外层循环:控制它要走几次。

假设你有5个数,那就要走4次,最后一次不用走,最后那个数已经在它位置了所以就要length-1次。

2:内层循环:控制逐一比较,如果发现前一个数比后一个数大,则交换。

注意!因为越比较长度就越小了,所以长度要length-1-i。

选择排序法

第一次从R[0]~R[n-1]中选取最小值,与R[0]交换。第二次从R[1]~R[n-1]中选取最小值与R[1]交换,以此类推。 
通俗点说就是每次找到后面元素的最小值然后与之交换。 
选择排序法效率中。

选择排序思路 
 1:外层循环:要走几趟,同样是length-1。 
 2:设置一个最小值。假设第一个就是最小值。 
 3:设置一个最小值下标,min
 4:内层循环:那你当前的最小值去逐一比较。当有比当前最小值小的数时,记录最小值,记录下标。 
 5:退出内层循环后就交换位置。

18.mysql

18.1.事务的特征(ACID)

18.2.数据库的优化

(1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。

(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。

(3)避免在索引列上使用计算

(4)避免在索引列上使用IS NULL和IS NOT NULL

(5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。  

(6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

  1. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

18.3.事务的隔离级别

19.css

盒子模型

把所有的网页元素都看成一个盒子,它具有: content,padding,border,margin 四个属性,这就是盒子模型。

一个盒子由外到内可以分成四个部分:margin(外边距)、border(边框)、padding(内边距)、content(内容)。会发现margin、border、padding是CSS属性,因此可以通过这三个属性来控制盒子的这三个部分。而content则是HTML元素的内容。

盒子的大小指的是盒子的宽度和高度。

盒子的宽度 = 内容宽度 + 左填充 + 右填充 + 左边框 + 右边框 + 左边距 + 右边距

盒子的高度 = 内容高度 + 上填充 + 下填充 + 上边框 + 下边框 + 上边距 + 下边距

为了显得专业一点,我们还可以用带属性的公式表示:

盒子的宽度 = width + padding-left + padding-right + border-left + border-right + margin-left + margin-right

盒子的高度 = height + padding-top + padding-bottom + border-top + border-bottom + margin-top + margin-bottom

20.javascript

闭包 闭包的本质就是在一个函数内部创建另一个函数。

1)闭包有3个特性
①函数嵌套函数
②函数内部可以引用函数外部的参数和变量
③参数和变量不会被垃圾回收机制回收

2)闭包的好处与坏处

好处

①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突

②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)

③匿名自执行函数可以减少内存消耗

坏处

①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;

②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响

21.session和cookie的区别

(1)cookie数据存放在客户的浏览器上,session数据放在服务器上

(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session

(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE

(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。

(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值