关于spring:要去面试先刷完这16道高频面试题阿里字节跳动美团任你选

2次阅读

共计 4893 个字符,预计需要花费 13 分钟才能阅读完成。

1.JDK8 新个性

Lambda 表达式 - 也是函数编程的一种形式(将函数做为参数)
办法的利用,利用已有的 java 类对象的办法或者结构器。与 Lambda 表达式相结合,办法利用使得语言结构更加简洁,从而缩小代码的冗余
默认办法,默认办法就是一个在接口里边有了一个实现的办法
新工具 - 新的编译工具,如:Nashorn 引擎 jjs, 类依赖分析器 jdeps
Stream API  – 把真正的函数式编程格调引入到 Java 中。
Date Time API – 增强对日期与工夫的解决
Optional 类 – Optional 类曾经成为 Java 8 类库的一部分,用来解决空指针异样
Base64 Java8 内置了 Base64 编码的编码器和解析器

2.hashMap 底层实现?当你 put 一个元素时,在底层构造是如何执行的?

   首先须要晓得在不同的 JDK 版本下面 hashMap 的实现是有区别的:

   JDK8 之前:数组 + 链表

   JDK8 之后:数组 + 链表 + 红黑树

当你 put 元素时:

 ####  执行步骤:

  a. 计算该元素的 hashCode 值

b. 通过计算它的 hashCode 值去确定数组下标, 数组的初始化 16 大小,增长因子为 0.75

  c. 当存在哈希抵触是,雷同的 hashCode 值得到的数组下标就是会一样的,则单纯的数组则不满足,须要链表的反对

  d. 链表满足长度大于 8 时转成红黑树,那为啥 8 呢,遵循泊松散布,红黑树均匀查找长度是 log(n),长度为 8 的时候,均匀查找长度为 3,如果持续应用链表,均匀查找长度为 8 /2=4,这才有转换为树的必要。

3.Spring 中 AOP 与 IOC 的个性,应用场景是在哪些方面?

AOP:面向切面编程,aspect oriented programming

 面向切面为的是将日志记录,性能统计,安全控制,事务处理,异样解决等代码从业务逻辑代码中划分进去

次要的性能:日志记录,性能统计,安全控制,事务处理,异样解决等等

IOC:管制反转,就是创建对象的操作交给 Spring 容器来做。DI 依赖注入,spring 通过 xml 配置文件实例化对象,依赖对象通过

setter 办法获取。

4.Spring 注解有哪些?

@Controller  用于标注管制层组件

@Service  用于业务层,也是实现接口

@Component 泛指组件,在不好归类状况下进行标注

@RequestMapping  申请映射,能够指定申请形式

@Resource 装 bean 注入应用:通过 byName 主动注入

@Autowired 主动拆卸 bean:通过 ByType 主动注入

@ResponseBody 响应返回数据类型 json

@Transactional 事务

5.RestController 与 @Controller 的区别?

@restcontroller 注解 等价于 @responseBody + @Controller

@Restcontroller 和 @controller 度用于 Spring 类是否承受 http 申请

区别之处:

@restcontroller  返回 json 数据不须要在办法后面加 @ResponseBody 注解了;不能返回 jsp,HTML 页面,视图解析器无奈解析 jsp,HTML 页面,而 @controller 能够返回指定的页面;

返回 json,xml 或者自定义格局内容到页面显示的话,@restController 单个操作就行,因为它能够主动将实体转成 Json 格局;而 @controller 须要加上 @responseBody 注解

6. 数据库优化有哪些形式?

1. 抉择适合的字段属性
2. 应用连贯 join 代替子查问
3. 应用 union 代替手动创立的长期表
4. 事务
5. 锁定表
6. 应用外键
7. 应用索引
     索引应建设在那些将用于 JOIN,WHERE 判断和 ORDERBY 排序的字段上。尽量不要对数据库中某个含有大量反复的值的字段建设索引。比方枚举类型
8. 优化查问语句

7. 什么是索引?

索引是对数据库表中一列或者多列的值进行排序的一种构造,应用索引能够快速访问数据库表中特定信息。

索引类型 5 种:

一般索引:仅减速查问

惟一索引:减速查问 + 列值惟一(能够有 null)

主键索引:减速查问 + 列值惟一(不能够有 null)+ 表中只有一个

复合索引:多列值组成一个索引

全文索引:对文本的内容进行分词,进行搜寻

8. 什么是复合索引?

用户能够在多个列建设索引,叫做复合索引。

9. 什么是最左匹配准则?

最左匹配准则,以最左为终点任何间断的索引都能匹配上。遇到范畴查问时就会进行匹配。

 

10.Mybatis 中的 号与 符号区别是什么?什么中央会用到 ${}?

井号 SQL 的参数占位符,mybatis 会将 SQL 的 #{} 替换成?号占位符设置参数存在预编译、避免 SQL 注入

${}是变量占位符,属于动态文本替换,不存在预编译;

须要原样输入的时候能够 ${}形式;举荐应用 #{}形式,安全性高。

11.Spring DI 注入的三种形式?

1. 构造方法注入
 
  <bean id ="name" class="">
    <construcion-arg /> 能够应用这个 P 域和 C 域的形式;</bean>
 
  <bean id="userService" class="com.lyu.spring.service.impl.UserService">
    <constructor-arg name="userDao" ref="userDaoJdbc"></constructor-arg>
    <constructor-arg name="user" ref="user"></constructor-arg>
  </bean>
 
2.setter 注入
   提供 set 办法
 
 <!-- 注册 userService -->
<bean id="userService" class="com.lyu.spring.service.impl.UserService">
    <!-- 写法一 -->
    <!-- <property name="UserDao" ref="userDaoMyBatis"></property> -->
    <!-- 写法二 -->
    <property name="userDao" ref="userDaoMyBatis"></property>
</bean>
  
 
3. 基于注解的注入
 
  主动注入
  @Autowired:spring 注解,默认是以 byType 的形式去匹配与属性名雷同的 bean 的 id,如果没有找到,就通过 byName 的形式去查找,

12.SpringMVC 的工作流程(步骤)?

1、用户发送申请至前端控制器 DispatcherServlet
2、DispatcherServlet 收到申请调用 HandlerMapping 处理器映射器。
3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器 (如果有则生成) 一并返回给 DispatcherServlet。
4、DispatcherServlet 调用 HandlerAdapter 处理器适配器
5、HandlerAdapter 通过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller 执行实现返回 ModelAndView
7、HandlerAdapter 将 controller 执行后果 ModelAndView 返回给 DispatcherServlet
8、DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器
9、ViewReslover 解析后返回具体 View
10、DispatcherServlet 依据 View 进行渲染视图(行将模型数据填充至视图中)。
11、DispatcherServlet 响应用户

13.Mybatis 动静 SQL 标签有哪些?

1.select、insert、update、delete  四个根本的标签
2.resultMap  查问后果集进行主动封装,倡议少应用 resultType 标签
3.parameterMap  入参汇合进行封装
    <parameterMap id="ParameterMap" type="Student">
        <parameter property="studentId" resultMap="ResultMap"></parameter>
        <parameter property="studentName" resultMap="ResultMap"></parameter>
    </parameterMap>
 
    <resultMap id="ResultMap" type="Student">
        <id column="id" property="studentId"></id>
        <result column="name" property="studentName"></result>
    </resultMap>
4.selectKey 插入数据的时候获取该数据的 id 值
5.trim 去除
6.where 条件
7.set  
    留神的是:应用 set 能够主动去除逗号
    <update> update user 
    <set>
           <if test="param.name!=null and param.name !=''">
              name = #{param.name},
            </if>
    </set>  
    where id = #{param.id}  
 
8.if 联合 test 进行参数的判断
9.foreach 循环遍历
  foreach 元素属性有 item,index,collection,open,separator,close
    item:别名
    index:下标地位
    open:以什么开始
    separator:以什么符号作为分隔符
    close:以什么完结
 
    <select id="selectByIds" resultMap="baseMap">
        select * from user where id in
        <foreach collection="list" index="index" item ="item"  open="("  separator =","             close=")" >#{item}
        </foreach> 
    </select> 
 
     collection 的类型能够 list,array,map 对应的参数类型为:List、数组、map 汇合
 
10.choose 联合 when 与 otherwise 进行抉择
11.when  当啥时候
12.otherwise  另一种抉择
13.bind  绑定
14.resultType 跟 resultMap  成果是雷同

14. 为什么说 Mybatis 是半自动 ORM 框架?

本人的了解:ORM 指的是对象关系映射,mybatis 仅有对字段的关系映射,对象数据以及对象理论关系须要咱们本人手动去写 SQL 去实现和治理,而 hibernate 是全自动的 ORM 框架,领有残缺的 Javabean 对象与数据库表构造主动生成 SQL,之前本人入手过 Javabean 去实现数据库创立表构造是测试。另外,Mybatis 领有自动化 SQL 语句,在理论开发中都是不定因数而须要咱们去重写简单的 SQL 语句,hibernate 则没有那么灵便好用了。

15. 多线程创立的形式有哪些?

 多线程创立的形式有四种:

 第一种是继承 Thead 类,重写它的 run 办法,之后就能够调用

 第二种是实现 Runnable 接口,重写 run 形式

第三种是实现 callable 接口,重写 call 办法

第四种是采纳线程池,executorService 对象,也是须要配合 Runnable 进行实现

16. 如何更好的形容我的项目?我的项目是怎么样的一个流程?

本人感觉这块比拟单薄,尽管是本人做的我的项目,却不晓得如何去表白分明,如何去说出我的项目是怎么的一个流程,遇到这里我觉的有必要去借鉴一下大佬的意见。(

1. 我的项目背景 在怎么的条件下进行

2. 我的项目介绍  技术介绍,性能介绍

3. 我的项目参加人员  分工合作,负责人

4. 我的项目停顿施行状况 目前停顿,我的项目还剩下的工作量以及布局

5. 我的项目难题及解决   遇到技术难题如何解决的思考好答复,让你影响粗浅的比拟有深意问题,采纳哪些解决办法

6. 我的项目成绩   能够从前端性能点,暗藏 bug;从后端性能接口是否欠缺,是否存在容错问题

7. 总结反思   从 0 到 1 的这个过程你播种了多少?前期开发有啥倡议啥的?

正文完
 0