Java面试题 - 02

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 接着《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的缩写,是一种创建交互式网页应用的的网页开发技术。通过异步提交的方式,可以实现局部刷新,在不更新整个页面的前提下维护数据,提升用户体验度。


6. Ajax的原理是什么?


答:Ajax的原理简单来说是通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM进而更新页面。


二、数据库:


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有哪些核心模块?


答:主要有以下七大核心模块:


image.png


  • 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织入增强后,就产生一个代理类。


15. spring的AOP编程中使用的jdk动态代理和cglib动态代理有什么区别?


jdk动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用 InvokeHandler 来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。


  • 如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
  • 如果目标对象实现了接口,可以强制使用CGLIB实现AOP ,添加cglib库,再配置如下代码即可:

<aop:aspectj-autoproxy proxy-target-class="true"/>


  • 如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 。


(二)、SpringMVC


1. 什么是springMVC?


答:Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架。使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型。框架的目的就是帮助我们简化开发。


2. 简单描述一下SpringMVC的工作原理。


答:工作原理如下:


  • 用户向服务器发送请求,请求被springMVC前端控制器DispatcherServlet捕获;
  • DispatcherServlet通过HandlerMapping找到handler,并将此handler返回给DispatcherServlet;
  • DispatcherServlet将handler请求提交给HandlerAdapter去执行,并返回ModelAndView给DispatcherServlet;
  • DispatcherServlet将ModelAndView提交给ViewResoler视图解析器去解析,然后返回视图给DispatcherServlet;
  • DispatcherServlet将视图进行渲染,返回渲染后的视图,最后响应用户请求,将渲染后的视图呈现给用户。


3. springMVC有什么优点?


答:它是基于组件技术的,全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件;可以任意使用各种视图技术,而不仅仅局限于JSP;支持各种请求资源的映射策略;它应是易于扩展的。


4. springMVC和struts2有什么区别?


答:区别如下:


  • springmvc的入口是一个servlet即前端控制器(DispatcherServlet),而struts2入口是一个filter过虑器(StrutsPrepareAndExecuteFilter)。
  • springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
  • Struts采用值栈存储请求和响应的数据,通过OGNL存取数据,springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。


未完待续……




相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
33 2
|
14天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
19天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
15天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
41 4
|
16天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
57 4
|
1月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
92 1
Java面试题之Java集合面试题 50道(带答案)
|
28天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
54 5
|
27天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
21 1
|
1月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
28 3
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
427 37