一面:
- Spring 中 @Component 和 @Service 注解有什么区别
@Component 是一个通用的注解,@Repository、@Controller 和 @Service 都是这个注解的拓展,并且具有特定的功能。@Repository 注解在持久层中,具有将数据库操作抛出的原生异常翻译转化 Spring 的持久层异常的功能;@Controller 层是 SpringMVC 的注解,具有将请求进行转发,重定向的功能;@Service 层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
用这些注解对应用进行分层之后,就能将请求处理,业务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。
如何保证接口安全问题
SQL 中使用 like 会有什么问题
Mybatis 如何实现分页
Redis 自增ID
Redis 中哪个命令具有原子性
Redis 怎么解决数据不一致的问题
二面:
返回小于 n 的最大的一个素数
求小于 n 的最大的素数,可以从 n 开始往下减,每减一次都判断一下是不是素数;
在判断一个数是不是素数时,可以从平方根以下开始除(因为如果一个数不是素数,那么他的平方根以下总能找到一个被它整除的数)。
public static boolean isPrimMothed(int n){
if (n < 2 || n % 2 == 0) {
return false;
}
for(int i = 2; i <= Math.sqrt(n); i++) {
if (n%i == 0) {
return false;
}
}
return true;
}
public static Integer maxPrim(int n) {
int num = n -1;
for (; num > 2; num--) {
if (isPrimMothed(num)){
return num;
}
}
return 0;
}MySQL 为什么不能给表中的每一列都建立索引
基于B+树实现的索引中,B+数是一种自平衡的树,对每一列都建立索引,建立索引和维护索引(维持树平衡)的操作都是很大的开销。
MySQL的分页
limit m,n分页语句:返回满足条件的 100 行,撇去前面的 90 行,返回最后的 10 行
select * from dept order by deptno desc limit 90,10;
为什么不直接使用时间复杂度最好的排序算法
又重新考虑了下,除了常数项操作耗费的时间之外还有稳定性的问题。
Java 中的 Arrays.sort() 中就有考虑到常数项操作耗费时间的问题,当需要排序的数据的 size < 60 时,使用的是插入排序;而当 size > 60 时,使用的是归并排序或者快速排序(如果这两个排序的递归过程中产生了 size 小于 60 的块,还是会使用插入排序,虽然插入排序是O(N*2)级别的,但是常数项操作所需时间更少,当数据量小时,插入排序的优势就体现出来了)。
稳定性指的是大小相同的元素在拍完序之后还维持着原来的相对顺序,基础类型一般不关心稳定性(比如都是3,哪个3在前哪个3在后都无所谓);但是非基础类型就不行了。快速排序不能实现稳定性但是常数项更好,可以用来给基础类型排序;归并排序可以实现稳定性,可以给非基础类型排序。下面举一个例子说明稳定性在工程上的应用:
一个展示员工信息的表,先按照年龄升序排列
国籍 | 年龄 |
---|---|
中国 | 12 |
美国 | 13 |
中国 | 14 |
美国 | 15 |
这时候想要在此基础上按照国籍排序,就需要保持原来的相对次序,新的排序之后如下所示
国籍 | 年龄 |
---|---|
中国 | 12 |
中国 | 14 |
美国 | 13 |
美国 | 15 |
SpringAOP 基于Java 的什么特性
基于 Java 中的反射特性。
Spring AOP 中的动态代理主要有两种方式,JDK 动态代理和 CGLIB 动态代理。JDK 动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK 动态代理的核心是 InvocationHandler 接口和 Proxy 类。