【Java核心面试宝典】Day22、Java数据库、数据结构面经总结
一、数据库索引的作用和使用场景
作用:
1、通过创建唯一性索引,可以保证数据库中每一行数据的唯一性
2、大大加快数据检索速度,加快表与表之间的连接
3、在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序时间
4、通过使用索引,在查询过程中,可以优化隐藏器,提高系统性能
缺点:
1、创建索引和维护索引都需要消耗时间,这种时间会随着数量的增加而增加
2、索引需要占用一定的物理空间,除表结构要占用数据空间以外,索引也需要占用物理空间
3、当对表中数据进行增加。删除和修改时,都需要动态的维护索引,这样就降低了数据的维护速度
使用场景:
1、在经常需要搜索的列上,可以增加搜索速度
2、在拥有主键的列上,可以强制该列的唯一性和组织表中数据的排列结构
3、在经常需要建立连接的列上使用,可以加快连接查询的速度
4、在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,所以其指定的范围是连续的
5、在需要经常进行排序的列上使用索引,因为索引已经排序,所以可以加快排序的时间
6、在经常使用在where子句的列上创建索引,加快条件的判断
二、数据库优化有做过吗?有哪些优化?
数据库优化的方式:
1、选取最适用的字段属性(将表中字段的宽度设置得尽可能小;尽量把字段设置为not null,防止进行null值比较;尽可能将属性设置为数值型数据enum,数值型数据处理起来比文本数据要快)
2、使用连接(join)查询来代替子查询(是因为使用连接查询不需要在内存中创建临时表来完成逻辑上需要两个步骤的查询工作)
3、使用联合(union)来代替手动创建的临时表,(它会将需要创建临时表的两个或多个select查询合并到一个查询中,在客户端查询会话结束后,会自动删除这个临时表,保证数据库的完整性)
4、进行事务控制(事务的重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰)
5、锁定表(防止多条语句同时对一个表进行操作)
6、使用外键(增加表结构的关联性)
7、使用索引(加快查询速度)
8、优化查询语句(最好将相同的字段进行比较;在建有索引的列上尽量不要使用函数操作;在搜索字符型字段时,尽量不要使用like或通配符;避免在查询中进行自动类型转换,自动类型转换会让索引失效;)
三、二叉树如果一侧子树节点过多,如何优化?
在插入元素的时候不断的修改树结构,保持二叉树的平衡,就可以避免二叉树一侧子节点过多
四、B+树了解过吗?
B树和B+树主要用于数据库索引方面,
B树相对于平衡二叉树,每个节点包含的关键字增加了,在应用到数据库的时候,可以减少数据查询次数和复杂度。
B+树是B树的升级版,相对于B树,B+树更加充分的利用了节点空间,提升了查询速度,查询速度接近于二分查找。
B+树的特点:
- B+树的层级更少,相对于B树,B+树的非叶子节点所能够存储的关键字数量更多,树的层级更少,所以查询更快。
- B+树的查询速度更稳定,B+树的所有关键字数据都存储在叶子节点上,所以每次查找次数都是相同的,
- B+树天然具备排序能力,B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据的时候更加的方便,数据紧密型更高,缓存的命中率也会比B树高。
- B+树的全节点遍历更快,B+树遍历整棵树只需要遍历所有的叶子节点即可,
五、红黑树如何实现快速查询的?
利用二分查找提升查询效率
六、堆结构知道多少?说一说堆排序?
堆的结构是一个完全二叉树,主要是用于数组的存储,
堆分为大根堆和小根堆,堆排序是对直接选择排序的优化,以大根堆为例,在进行元素的排序的时候,会从所有的元素中取出最大的元素和第一个元素互换,然后再从剩下的元素里面选出最大的和第二个元素互换,以此类推,直到所有的记录排序完毕。
七、抽象类和接口的使用场景
抽象类的使用场景:
1、既想约束子类有共同的行为,又想拥有自己的方法,又能拥有实例变量
接口的应用场景:
- 约束多个类拥有统一的行为,但是不在乎每一个类是如何实现的。
- 作为能够实现特定功能的标识存在,或者是什么都不做的纯粹的标识
- 实现类具备很多不同的功能,但是这些功能没有什么联系
- 使用接口的引用调用具体实现类的方法
八、抽象类和接口的区别?
1、抽象类对变量没有限制,接口只能包含常量
2、抽象类拥有构造方法,接口没有构造方法
3、抽象类中的方法可以是抽象的,也可以不是抽象的,但是接口中的方法必须是public abstract的,
九、如何进行单元测试?
在代码编写完成之后,进行单元测试主要分为两个步骤:
- 人工静态检查
该阶段主要保证代码算法的正确性和逻辑性,尽可能的发现程序中没有发现的错误。
- 动态执行跟踪
执行待测程序,将实际运行结果和预期结果进行比较,发现其中存在的错误
十、如何实现低耦合?
1、少用继承,多用接口隐藏实现的细节
2、模块的功能设计尽可能的单一
3、遵循一个定义只在一个地方出现
4、少用全局变量
5、类中的属性和方法少用public,多用private
6、少用“硬编码”,尽量避免直接使用sql语句操作数据库
7、尽量减少模块直接操作或调用其他模块,
8、尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,不用内容耦合
十一、聚集索引和非聚集索引的区别?
聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序
聚集索引的使用情况:
- 列经常被分组排序
- 返回某范围内的数据
- 数据列中的数据基本不同
- 主键列和外键列
非聚集索引:数据存储在一个地方,索引存储在另一个地方,索引的指针指向数据的存储位置
非聚集索引的使用情况:
- 列经常用分组排序
- 频繁更新的列
- 主键列和外键列
- 频繁修改索引列
十二、springboot中的容器有什么用?
1、添加组件(@configtion、@bean、Component、@Controller、@Service、@Repository)
2、导入xml配置文件
十三、shiro中的token有什么用?是如何生成的?
Token的使用比session更有用,因为session过多的时候会占用服务器资源,而且在分布式系统中很难完成session的共享,
Token和session的作用都是对用户请求进行合法性认证。
Token存放位置:
Token会放置在请求头中,在前后端分离的时代,服务器认证通过之后,会返回给客户端一个token,在vue项目中,将这个token设置在全局cookie中,每次请求通过interceptors.request.use这个拦截,动态地为每个请求带上刚刚那个token,
Token的实现过程:
1.用户登录校验,校验成功后就生成Token并返回给客户端。
2.客户端收到数据后保存在客户端的cookie中
3.客户端每次访问API都从cookie中取出token并携带到服务器端。
4.服务器端采用filter过滤器校验请求携带的token。校验成功则返回请求数据,校验失败则返回错误码
不存储token,无论在缓存中或者数据库中的验证过程:在用户登录认证完成之后,服务器会向客户端返回一个加了密的token,这个token是由用户请求的部分信息、请求的URL、时间戳这三部分融合在一起形成的,在客户端再次发送请求的时候,会重新根据请求的部分内容、请求的URL、时间戳生成一个新的token,然后将这个新的token和之前的token进行比较,如果相同则这次合法。这样token不会占用存储空间,而且加密的过程要比从数据库中进行查询快得多。
十四、vue和后台交互时如何规范接口?
一般常使用代理方式配置接口
以上是我在面试之后的总结,欢迎小伙伴们补充指正!
我是灰小猿,我们下期见!
- 点赞
- 收藏
- 关注作者
评论(0)