JAVA小额面试题

1.JSP和Servlet的区别

  1. JSP 经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
  2. JSP 更擅长表现于页面显示,servlet更擅长于逻辑控制。
  3. Servlet 中没有内置对象,JSP中有内置对象,可通过HttpServletRequest对象、HttpServletResponse 对象以及 HttpServlet 对象得到。
  4. JSP 是 Servlet 的一种简化,使用 JSP 只需要完成程序员需要输出到客户端的内容,JSP 中的Java脚本如何镶嵌到一个类中,由JSP 容器完成。而 Servlet则是个完整的Java类,这个类的 Service方法用于生成对客户端的响应

2.什么是SpringBoot

  • 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)
  • 创建独立的spring引用程序 main方法运行
  • 简化maven配置
  • 自动配置spring添加对应功能starter自动化配置
  • spring boot来简化spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用

3.ArrayList 和 LinkedList 的区别

ArrayList 是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。

LinkedList 是以链表的形式存储数据,每一个元素都和它前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

相对于ArrayList,LinkedList的插入、添加和删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者更新索引。

4.乐观锁和悲观锁

乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。

悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。

数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观l锁。

5.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响应用户

springboot

面试官问你你可以这样说,springboot是通过main方法下的SpringApplication.run方法启动的,启动的时候他会调用refshContext方法,先刷新容器,然后根据解析注解或者解析配置文件的形式祖册bean,而它是通过启动类的SpringBootApplication注解进行开始解析的,他会根据EnableAutoConfiguration开启自动化配置,里面有个核心方法ImportSelect选择性的导入,根据loadFanctoryNames根据classpash路径以MATA-INF/spring.factorces下面以什么什么EnableAutoConfiguration开头的key去加载里面所有对应的自动化配置,他并不是把这一百二十多个自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的jar包,再判断容器是否有bean再进行注入到bean容器

6.什么是mybatis?

Mybatis是一半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要管住SQL语句本身,不需要忽而费精力去处理加载驱动,创建连接,创建statement等复杂过程,程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。

7.为什么说mybatis是半自动ORM映射工具?它和全自动的区别在哪里?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的,而Mybatis在查询关联对象或关联集合时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

8.Mybatis的优缺点?

优点:

  1. 基于SQL语句编程,相当灵活,不会对应用程序或数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理,提供XML标签,支持编写动态SQL语句,并可重用。
  2. 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接。
  3. 能够与spring很好的集成,
    4. 提供映射表前,支持对象与数据库的ORM字段关系映射,提供对象关系映射标签,支持对象关系组件维护。

缺点:

  1. SQL语句的编写工作量较大,尤其当字段多,关联表多时,对开发人员编写SQL语句的功底有一定要求。
  2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

9.Mybaits的解析和运行原理?

Mybatis的运行过程分为两大步:

  • 读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory;
  • SqlSession的执行过程。

Mybatis底层架构的基础掌握;

  • 反射技术
  • 动态代理技术

10.#{}和${}的区别?

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

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

Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值,使用#{}可以有效的防止SQL注入,提高系统安全性。

11.Mybatis的一级二级缓存?

  1. 一级缓存:基于PerpetualCache的HashMap本地缓存,其储存作用域为Session,当Seesion flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。
  2. 二级缓存与一级缓存其机制相同,默认也是采用PerpetualCache,,HashMap储存,不同在于其储存作用域为Mapper(Namespace),并且可自定义储存源,如Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要。实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置
  3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear。

12.SpringBoot常用注解?

  • @springbootApplication
  • @ImportAutoConfiguration 导入配置类,一般做测试的时候使用,正常优先使用 @EnableAutoConfiguration
  • @springbootConfiguration
  • @ImportResource 将资源导入容器
  • @PropertySource 导入properties文件
  • @Scope 指定bean的作用域
  • @Lazy 使bean懒加载,取消bean预初始化。
  • @Profile 指定Bean在哪个环境下被激活
  • @Autowired 默认按类型装配

13.什么是微服务?

微服务(Microservice Architecture)是近几年流行的一种架构思想微服务化的核心就是将传统的一站式应用,根据业务拆分成一个个的服务,彻底的去耦合,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或者销毁,拥有自己独立的数据库。

14.springboot和springmvc的区别?

springboot只是一个配置工具,整合工具,辅助工具。

springmvc是框架,项目中实际运行的代码

springmvc是基于spring的一个mvc框架。

springboot是基于spring4的条件注册的一套快速开发整合包。

15.springboot和springcloud的区别?

  • springBoot专注于快速方便的开发单个个体微服务。
  • springcloud是关注全局的微服务协调整理治理框架,它将springboot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供:配置管理,服务发现,断路由,微代理,事件总栈,全局锁,决策竞选,分布式会话等等集成服务。
  • springboot可以离开springcloud独立使用,开发项目,但是springcloud离不开springboot属于依赖关系
  • springBoot专注于快速,方便的开发单个个体微服务,springCloud管住全局的服务治理框架。

16.spring是什么?

  • spring是轻量级的Java开发框架,可以解决企业应用加法的业务逻辑层和其他的耦合关系,
  • spring的本质就是解决开发的复杂性,简化java开发
  • spring可以做很多事情,以来两个核心特性,依赖注入和面向切面编程。

17.什么是ioc

springioc负责创建对象,管理对象(通过依赖注入(DI)),装配对象,配置对象,并且管理这些对象的整个生命周期。

18.什么是依赖注入–DI,依赖注入,是ioc的重要实现

在依赖注入中,您不必创建对象,但必须描述如何创建它们。您不是直接在代码中将组件和服务连接在一起,而是描述配置文件中哪些组件需要哪些服务。由 IoC 容器将它们装配在一起

19.什么是AOP–面向切面编程?

AOP(Aspect-OrientedProgramming),即面向切面编程,它与OOP(Object-O日恩特点Programming,面向对象编程)相辅想成,提供了与OOP不同的抽象软件结构的视角,在OOP中,我们以类作为我们的基本单元,而AOP中的基本单元是Aspect(切面)。

20.spring中的事务隔离级别?

  1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. 另外四个与JDBC的隔离级别相对应
  2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。 这种隔离级别会产生脏读,不可重复读和幻像读。
  3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
  4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
  5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。 除了防止脏读,不可重复读外,还避免了幻像读。

什么是脏数据,脏读,不可重复度,幻觉度?

  1. 脏读: 指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
  2. 不可重复读: 指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
  3. 幻觉读: 指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

21.springBean的作用域?

Spring bean 支持 5 种 作用域:

  1. Singleton** - 每个 Spring IoC 容器仅有一个单实例。
  2. Prototype - 每次请求都会产生一个新的实例。
  3. Request 每一次 HTTP 请求都会产生一个新的实例,并且该 bean 仅在当前 HTTP 请求内有效。
  4. Session - 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效。
  5. Global-session 类似于标准的 HTTP Session 作用域,不过它仅仅在基于 portlet 的 web 应用中才有意义。Portlet 规范定义了全局 Session 的概念,它被所有构成某个 portlet web 应用的各种不同的 portlet 所共享。

仅当用户使用支持 Web 的 ApplicationContext 时,最后三个才可用

22.数据库的事务隔离级别

  1. 提交已读

    ​ a.只能读到已经提交的事务,最常用的,保证了一个事务不会读取到,并行中的
    另一个事务保存未提交的数据,避免了脏读,但是不能避免幻读,和不可重复

  2. 读未提交
    a.当一个事务进行写操作,另一个事务就不允许写操作,但是允许事务读取数
    据,但是可能出现脏读,就是事务b读取到事务a的数据

  3. 可重复读
    a.顾名思义就是解决了不可重复读的隔离级别,也是Mysql的默认隔离级别,当
    可重复读启动时,不允许进行修改操作,但是避免不了幻读,以为幻读时由
    于"插入或者删除操作"

  4. 可串行化
    a.隔离性是最高级别的,只能是-一个一一个的执行,脏读,幻读,不可重复代都会
    避免,但是效率低,性能开销大。

23.MySQL事务得四大特性

  • 原子性: 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  • 一致性: 指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的。
  • 隔离性: 多个事务并发访问时,事务之间是相互隔离的,即一个事务不影响其它事务运行效果。简言之,就是事务之间是进水不犯河水的。
  • 持久性: 表示事务完成以后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。

24.数据库三范式

  • 第一范式:数据表中的每一列(每个字段)都不可以再拆分。
  • 第二范式:在第一范式的基础上,分主键列完全依赖于主键,而不能是依赖于主键的一部分。
  • 第三范式:在满足第二范式的基础上,表中的非主键只依赖于主键,而不依赖于其他非主键。

25.索引有哪几种类型

  • 主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
  • 唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
  • 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
  • 全文索引:是目前搜索引擎使用的一种关键技术,对文本的内容进行分词、搜索。
  • 覆盖索引:查询列要被所建的索引覆盖,不必读取数据行
  • 组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并

26. 索引有哪些优缺点?

优点:

  • 唯一索引可以保证数据库表中每一行的数据的唯一性
  • 索引可以加快数据查询速度,减少查询时间

缺点:

  • 创建索引和维护索引要耗费时间
  • 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间
  • 以表中的数据进行增、删、改的时候,索引也要动态的维护。

mybatis批量处理数据!

新增批量处理数据

insert 允许 values(),(),()

 <insert id="insertSelective" parameterType="java.lang.String" >
    insert into T_Alarm_Group_Rel_Param (AlarmGroupID,AlarmID) values
      <foreach collection="array" item="person" separator=",">
        (#{alarmgroupid},#{person})
      </foreach>
  </insert>

删除批量处理数据

<where>
      AlarmGroupID=#{alarmgroupid} and AlarmID in
      <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
        #{item}
      </foreach>
</where>

修改批量数据

 <foreach collection="list" item="item" index="index" open="" close="" separator=";">
               update table
               <set>
                 state=${item.state}
               </set>
               where id = ${item.id}
        </foreach>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值