这份面试题包含了 19 个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 等。
1、JS中”==”与“===”的区别?(详细链接)
== equality 等同,=== identity 恒等。
==, 两边值类型不同的时候,要先进行类型转换,再比较。
===,不做类型转换,类型不同的一定不等。
一言以蔽之:==先转换类型再比较,===先判断类型,如果不是同一类型直接为false。
2、final 在 java 中有什么作用?(链接)
final作为Java中的关键字可以用于三个地方。用于修饰类、类属性和类方法。
特征:凡是引用final关键字的地方皆不可修改!
(1)修饰类:表示该类不能被继承;
(2)修饰方法:表示方法不能被重写;
(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。
3、java 中操作字符串都有哪些类?它们之间有什么区别?
String、StringBuffer、StringBuilder
区别: String : final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符 串的修改操作都会生成新的对象。
StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。
StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用 StringBuilder对象的append、replace、delete等方法修改字符串。
4、对作用域上下文和this的理解。(https://blog.csdn.net/sinat_36414515/article/details/81303492)
this是函数运行时候才能确定的,和函数怎么定义无关。如果是对象打点调用,this就是对象。如果是圆括号直接调用就 是window对象,就是全局变量。
5、Js中的prototype是什么?具体怎么用?(https://zhidao.baidu.com/question/1638319571453900380.html)
prototype是原型的意思,也就是JS对象的原型,一般用来扩展原型的时候用.
prototype是一个属性,所有的函数都有,这个属性引用了一个对象 . prototype对象是实现面向对象的一个重要机制.每个函 数都是一个对象,它们对应的类就是function,每个函数对象都具有一个子对象prototype,prototype表示了该函数的原型.
6、使用jquery如何找到所有的HTML select标签中的选中项。
<body>
<select name="n_select" class="c_select" id="i_select1">
<option value="1">1</option>
<option value="2">2</option>
<option value="3" selected>3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<select name="n_select" class="c_select" id="i_select2">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4" selected >4</option>
<option value="5">5</option>
</select>
</body>
以下就是js的部分:
<script type="text/javascript">
JQ:
获取所有选中的项(获取所有的select的选中项需遍历载具体取相应的值)
$('[name=n_select] :selected');
$('.c_select option:selected');
$('.c_select').find('option:selected');
获取select 选中的值(只返回第一个select )
$('[name=n_select] :selected').text(); // 获取select选中项的文本
$('[name=n_select] :selected').val(); // 获取select选中项的值
$('.c_select option:selected').text(); // 获取select选中项的文本
$('.c_select option:selected').val(); // 获取select选中项的值
$('.c_select').find('option:selected').text(); // 获取select选中项的文本
$('.c_select').find('option:selected').val(); // 获取select选中项的值
JS:
// 兼容至IE9+
var tag_select = document.getElementsByClassName('c_select'); // 获取所有select
// 至少兼容值IE7,IE6没测试
var tag_select = document.getElementsByTagName('select'); // 获取所有select
// 至少兼容值IE7,IE6没测试
var tag_select = document.getElementsByName('n_select'); // 获取所有select
// 至少兼容值IE7,IE6没测试 (下面索引1只是随便举例,可遍历 tag_select 获取所有的)
var tag_sValue = tag_select[1].value; // 获取某个select选中项的值
var tag_sIndex = tag_select[1].selectedIndex; // 获取某个select选中项的索引
var tag_oValue = tag_select[1].options[tag_sIndex].value; // 获取某个select选中项的值
var tag_oTexts = tag_select[1].options[tag_sIndex].text; // 获取某个select选中项的文本 .text 或者 .innerText 都可以获取
</script>
7、Jquery.ajax()的异步请求与同步请求使用时有什么区别?
同步请求 | 发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 用户填写所有信息后,提交给服务器,等待服务器的回应(检验数据),是一次性的。信息错误又要重新填写! |
异步请求 | 发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。 当用户填写完一条信息后,该信息会自动向服务器提交,然后服务器响应客户端,在此过程中,用户依然在填写表格的信息,即向服务器请求多次,节省了用户的时间,提高了用户的体验。 |
8、Ajax请求的时候get和post方式的区别?
get请求不安全,post安全
get请求数据有限制(不能大于2KB),post无限制
get请求参数会在url中显示,容易被他人窃取,post在请求体中,不会被窃取
post需要设置请求头
9、CSS中margin、padding的作用、以及单参、双参、四参数在方向上的顺序。
margin是对外元素的距离,用来控制元素本身的浮动位置;
padding是对内元素,用来控制元素内部元素的位置;
padding:1px2px3px4px; margin:5px6px7px8px; 上右下左
10、mybatis 中 #{}和 ${}的区别是什么?
1) #和$都可以充当占位符,
#的底层是通过PreparedStament实现的,$的底层是通过Stament实现的
2) 只有传入数据库对象时才会使用到$
2.1按照某个表进行查询时输入表名
2.2按照表中的某一列进行排序时,输入类名
3) 在传入非数据使用库对象时最好不要使用$
4) #是先编译sql语句在传值,传入的值加上双引号
$是直接拼接字符串,不会给传入的值加上双引号
5) #会防止sql注入,$不会
11、mybatis 有几种分页方式?(https://www.cnblogs.com/aeolian/p/9229149.html)
Mybatis四种分页方式:数组分页、sql limit分页、拦截器分页、RowBounds分页
12、说一下 mybatis 的一级缓存和二级缓存?
Mybatis的一级缓存 | 一级缓存是指Session缓存。 一级缓存的作用域默认是一个SqlSession。Mybatis默认开启一级缓存。也就是在同一个SqlSession中,执行相同的查询SQL,第一次会去数据库进行查询,并写到缓存中;第二次以后是直接去缓存中取。 当执行SQL查询中间发生了增删改的操作,MyBatis会把SqlSession的缓存清空。 |
Mybatis的二级缓存 | Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。 二级缓存是默认启用的(要生效需要对每个Mapper进行配置),如想取消,则可以通过Mybatis配置文件中的元素下的子元素来指定cacheEnabled为false。 |
13、mybatis 动态sql标签中循环标签中有哪些属性,各自的作用。
foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。如下:
foreach标签主要用于构建in条件,他可以在sql中对集合进行迭代。如下:
<delete id="deleteBatch">
delete from user where id in
<foreach collection="array" item="id" index="index" open="(" close=")" separator=",">
#{id}
</foreach>
</delete>
我们假如说参数为---- int[] ids = {1,2,3,4,5} ----那么打印之后的SQL如下:
delete form user where id in (1,2,3,4,5)
释义:
collection :collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合,我在上面传的参数为数组,所以值为array
item : 表示在迭代过程中每一个元素的别名
index :表示在迭代过程中每次迭代到的位置(下标)
open :前缀
close :后缀
separator :分隔符,表示迭代时每个元素之间以什么分隔
我们通常可以将之用到批量删除、添加等操作中。
14、mybatis 动态sql中使用<where>标签与直接写where关键字有什么区别?
where标签为MyBatis的动态语句。
<select id="selectByParams" parameterType="map" resultType="user">
select * from user
<where>
<if test="id != null ">id=#{id}</if>
<if test="name != null and name.length()>0">
and name=#{name}
</if>
<if test="gender != null and gender.length()>0">
and gender = #{gender}
</if>
</where>
</select>
上述代码中若where标签里的if全不成立,则不走where语句。
若第一个if标签里ID的值为null的话,那么打印出来的SQL为:select * from user where name=”xx” and gender=”xx”
会把AND/OR自动忽略掉。
若直接用where子句的话可能会导致sql语法错误,查询失败。
15、请说明filter和inteceptor的区别。(https://blog.csdn.net/testcs_dn/article/details/80279578)
- Filter是基于函数回调的,而Interceptor则是基于Java反射的。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
-
Filter和Interceptor的执行顺序: 过滤前-拦截前-action执行-拦截后-过滤后
16、Spring MVC中@requestMapping六个属性value\method\consumes\produces\params\headers的作用。 (https://www.cnblogs.com/JunLoveHua/p/10790614.html)
1)、 value, method;
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
17、Spring mvc @ResponseBody什么时候使用、@PathVariable怎么用?(https://blog.csdn.net/u013025649/article/details/84230828)
@RequestBody | (通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。实质上接受的是一个JSON的字符串) 1) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上; 2) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。 |
@ResponseBody | Controller层为控制视图层,当网页端一个请求发送到后台时,后台的控制视图层通过@RequestMapping映射相应的视图方法,如果在视图方法上用注解@ResponseBody标识后,方法执行完后返回的内容会返回到请求页面的body上,直接显示在网页上。 |
@PathVariable | XXXController包括了常用的Get、Post、Put、Delete请求,并使用注解的方式说明了请求路径 路径中的{id}元素是路径参数,可以通过@PathVariable注解获取 |
18、Spring @ Resource 和Autowired有什么区别?(https://www.jb51.net/article/107375.htm)
注解 @Resource 的作用相当于 @Autowired,
@Resource | @Resource 则默认按 byName 自动注入。 @Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注解的 name 属性解析为 bean 的名字,而 type 属性则解析为 bean 的类型。因此,如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。 |
@Autowired | @Autowired 按 byType 自动注入 |
19、Aop 中切面的切入时机有哪些、切点表达式的几种写法。
Aop切点表达式:execution(*com.aptech.jb.epet.dao.hibimpl.*.*(..))
第一个*代表所有的返回值类型
第二个*代表所有的类
第三个*代表类所有方法
最后一个..代表所有的参数。
20、为什么要使用 spring?
1).方便解耦,便于开发(Spring就是一个大工厂,可以将所有对象的创建和依赖关系维护都交给spring管理)
2).spring支持aop编程(spring提供面向切面编程,可以很方便的实现对程序进行权限拦截和运行监控等功能)
3).声明式事务的支持(通过配置就完成对事务的支持,不需要手动编程)
4).方便程序的测试,spring 对junit4支持,可以通过注解方便的测试spring 程序
5).方便集成各种优秀的框架()
6).降低javaEE API的使用难度(Spring 对javaEE开发中非常难用的一些API 例如JDBC,javaMail,远程调用等,都提供了 封装,是这些API应用难度大大降低)