JAVA面试题总结(一)

22 阅读2分钟

Q1:解释一下Redis主从复制和哨兵模式,什么情况下需要用到哨兵模式?

主从模式:master节点挂掉后,需要手动指定新的master。
哨兵模式:master节点挂掉后,哨兵进程会主动选举新的master,可用性高,但是每个节点存储的数据是一样的,浪费内存空间。数据量不是很多,集群规模不是很大,需要自动容错容灾的时候使用。
主从模式下,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费时费力,还会造成一段时间内服务不可用。这种方式并不推荐,实际生产中,我们优先考虑哨兵模式。这种模式下,master宕机,哨兵会自动选举master并将其他的slave指向新的master。

Q2:SpringBoot的启动注解。

启动类上面的注解是@SpringBootApplication,它也是Spring Boot的核心注解,主要组合包含了以下3个注解:
@SpringBootConfiguration:组合@COnfiguration注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})。
@ComponenetScan:Spring组件扫描。

Q3:什么情况下用到索引?

where子句、group子句中出现的字段,需要创建索引
order by子句的字段,需要创建索引
统计聚合函数中的字段,要创建索引

Q4:哈希表的算法有哪些?什么是哈希?

算法:直接定址法、除留余数法、数字分析法
哈希既可以是一种数据结构,也可以是一种函数概念 通过某种函数使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。

Q5:mybatis中的#{}和${}的区别

区别一:#{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理
区别二:Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理${}时,是原值传入,就是把{}替换成变量的值,相当于JDBC中的Statement编译
区别三:变量替换后,#{}对应的变量自动加上单引号;变量替换后,${}对应的变量不会加上单引号
区别四:#{}可以有效地防止SQL注入,提高系统安全性;${}不能防止SQL注入
区别五:#{}地变量替换是在DBMS中;${}的变量替换是在DBMS外\