新一轮面试
# 新一轮面试
# 为什么重写 equals 还要重写 hashcode?
保证 hashCode中 “相同对象必须有相同哈希值” 的约定
1
# == 和 equals 比较的区别
==”和equals 最大的区别是
“==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值。
equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值
1
2
3
2
3
# 为啥有时会出现 4.0 - 3.6 = 0.40000001 这种现象?
浮点数据精度缺失 可以使用 BigDecimal类
1
# final 关键字的作用
final可以修饰类、方法、变量
修饰类 类不能被继承
修饰方法 方法不能被重写
修饰基本数据类型 这个变量代表的数值永不能改变
修饰引用数据类型 引用地址不能发生改变 但是该对象的属性值可以发生改变
1
2
3
4
5
2
3
4
5
# 介绍 Java 的集合类
集合类是放在java.util.*;
3种:set(集)、list(列表)、map(映射)和Queue(队列)
HashSet TreeSet
ArrayList LinkedList Stack Vector
HashTaple HashMap WeakHashMap TreeMap
1
2
3
4
5
2
3
4
5
# ArrayList 和 LinkedList 的区别
ArratList 底层基于数组实现 优势在于查找遍历 随机访问 但是为了保证连续存储 添加和删除效率就低
LinkedList 底层基于链表实现 优势在于添加和删除 查找和随机访问效率差
1
2
2
# java 8 有哪些新特性?
Lambda表达式 函数式接口 Stream API
1
# redis的雪崩等问题
缓存穿透 大规模的获取一个数据或者url 但这个key不存在 就会去数据库中查找 以至于压垮数据库
解决 对空值缓存 布隆过滤器 实施监控、
缓存击穿 key过期 大并发访问这个key(瞬时)
解决 加锁 实时调整过期时间
雪崩 大量key过期 导致数据库压力大 崩溃
解决 多级缓存 缓存时间分散开 设置标志 更新缓存 集群
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# IOC 和 AOP
IOC 控制反转 将对象交给Spring 进行管理
AOP 核心业务 和 非核心业务
1
2
2
# @Resource 和 @Autowired
@Resource是Java自己的注解,@Resource有两个属性是比较重要的,分是name和type;Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略
@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根据type进行注入,不会去匹配name。如果涉及到type无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰
1
2
3
2
3
# #{} 和 ${} 的区别
#{} 使用了预编译机制 使用`?`占位符 预编译完成之后,SQL的结构已经固定 可以有效的防止SQL注入问题
${} 会直接进行SQL参数的拼接
1
2
2
# VO、DTO、DO、POJO
VO (View Object) 用于表示一个与前端进行交互的视图对象 它的作用是把某个指定页面(或组件)的所有数据封装起来
实际上 这里的 VO 只包含前端需要展示的数据 对于前端不需要的数据,比如创建和修改的时间等字段,不应该在 VO 中体现出来
DTO(Data Transfer Object) 用于表示一个数据传输对象 DTO 通常用于展示层(Controller)和服务层(Service)之间的数据传输对象
DTO 与 VO 概念相似 并且通常情况下字段也基本一致。
DO(Data Object) 持久化对象,它跟持久层(Dao)的数据结构形成一一对应的映射关系
如果持久层是关系型数据库 那么数据库表中的每个字段就对应PO的一个属性 常是entity实体类
POJO(plian ordinary java object) 代表简单无规则的对象 最基本的Java Bean对象 加上属性和 get set 方法
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# MyBatis是如何将sql执行结果封装为目标对象并返回的?MyBatis怎么生成实体类的?都有哪些映射形式
第一种是使用 <resultMap> 标签,逐一定义列名和对象属性名之间的映射关系;
第二种是使用sql列的别名功能,将列别名书写为对象属性名;
有了列名与属性名的映射关系后,MyBatis通过反射创建对象,同时给对象的属性逐
一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
1
2
3
4
2
3
4
# 实体类属性和表字段不一致怎么处理?
方案1: 设定显示列的别名 让显示列的别名与实体类的属性名相同
方案2: 使用resultMap自定义封装规则 可以重复利用
方案3: 使用Map集合封装结果集中的数据 简单 可以重复使用 又无需额外维护封装规则但是破坏了ORM的映射规则 不推荐!!
1
2
3
2
3
# MyBatis的selectKey标签
selectKey这个标签主要用于解决“添加数据”时不支持主键自动生成的问题,他可以很随意的设置生成主键的方式;
selectKey需要注意order属性
MySql这类支持自动增长类型的数据库中,order需要设置为after才会取到正确的值
Oracle这样取序列的情况 order需要设置为before 否则会报错
1
2
3
4
2
3
4
# MyBatis都有哪些动态sql?
MyBatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑
判断和动态拼接sql的功能;
MyBatis提供了9种动态sql标签 <trim>、<where>、<set>、<foreach>、<if>、
<choose>、<when>、<otherwise>、<bind>
1
2
3
4
2
3
4
# SQL的优化
· 选择有效的表顺序 让数据量少的在前面 (小表驱动大表)
· 表的连接在where查询语句之前
· 避免使用 * 查询所有
· 合理使用索引 注意索引的数量
· Join 的表不宜过多 小驱动大
· 提升group by的效率 先缩小数据的范围 再去分组
1
2
3
4
5
6
2
3
4
5
6
# SQL中对索引的理解以及索引失效的场景
索引是数据库中用于提高查询速度的数据结构。它类似于书籍的目录,可以帮助我们快速找到所需的信息。
在SQL中,索引可以分为以下几种类型:
· B-Tree索引:这是最常见的索引类型,适用于各种数据类型的列。
B-Tree索引可以加速数据的检索、排序和分组操作。
· 哈希索引:适用于等值查询的场景,例如WHERE子句中的常量表达式。
哈希索引可以提供非常快的查询速度,但是不支持范围查询和排序操作。
· 空间索引:适用于地理空间数据类型的列,例如经度和纬度。
空间索引可以加速空间查询,如距离计算和范围查询。
· 全文索引:适用于文本数据的搜索场景,例如搜索引擎。
全文索引可以加速文本查询,如模糊匹配和词干提取。
在某些场景下,索引可能会失效,导致查询性能下降。以下是一些可能导致索引失效的场景:
· 不恰当的使用函数或表达式:在使用索引的列上进行函数计算或表达式操作时,可能会导致索引失效。
因为数据库需要对每一行执行函数计算,然后再比较结果是否符合查询条件。
· 使用不等于(<>或!=)操作符:在索引列上使用不等于操作符时,可能会导致全表扫描,而不是使用索引。
这是因为数据库无法确定哪些行满足查询条件,所以需要检查所有行。
· 使用OR操作符:在多个条件中使用OR操作符时,可能会导致索引失效。
因为数据库需要检查每一行以确定它是否满足至少一个条件,这可能导致全表扫描。
· 数据分布不均匀:如果索引列的数据分布非常不均匀,例如大部分数据都集中在某个范围内,
那么查询其他范围的数据时,数据库可能无法有效地使用索引。
· 选择性低的列:如果一个列的值重复率很高,那么在这个列上创建的索引可能不会带来太大的性能提升。
因为查询时可能需要检查很多重复的值才能找到所需的数据。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# MyBatis都有哪些动态sql?
<if>:最常用的动态 SQL 标签,用于根据条件判断来决定是否包含某段 SQL
<choose>、<when>、<otherwise>:这些标签一起工作,类似于 Java 中的 switch 语句。根据条件判断,选择不同的 SQL 片段执行
<trim>、<where>、<set>:这些标签主要用于修改 SQL 语句,如添加“WHERE”、“SET”关键字,防止这些关键字的错误使用
<foreach>:这个标签非常强大,可以在 SQL 语句中遍历一个集合,通常用于生成批量插入和更新语句
<bind>:这个标签可以创建可以在 OGNL 表达式上下文中使用的变量
1
2
3
4
5
2
3
4
5
上次更新: 2023/11/01, 15:16:13