算法题:
解题思路:
题目给的是排序数组,没说升序降序,已知条件就是相同的数会在一块,可以维护两个指针一个数,一个指向下一个要填充的位置,这个指针之前的都是删除重复项后的。另一个指针指向当前位置,同时维护一个数,表示上一个数。每次比较当前指针和上个数,相同则下一个,不相同则填充到第一个指针。
解题思路:
遍历取子字符串,长度为10,用哈希表记录次数即可。
你对项目掌握多少,是跑起来还是可以实现一些业务还是了解比较深。
提到拦截器,那spring实现拦截器原理是什么
- JDK动态代理:对于实现了接口的类,Spring可以使用JDK动态代理来创建拦截器的代理对象。JDK动态代理通过反射机制在运行时动态地生成代理类的字节码,并创建代理类的实例。这个代理实例会在调用目标方法时,先执行拦截器的逻辑,然后再调用目标方法。
- CGLIB动态代理:对于没有实现接口的类,Spring会使用CGLIB动态代理。CGLIB是一个强大的、高性能的代码生成库,它可以在运行时扩展Java类和实现接口。CGLIB通过继承目标类来创建代理对象,因此它不需要目标类实现接口。
AspectJ和AOP中CGlib和jdk动态代理你选择哪个。
如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);
如果要被代理的对象不是个实现类那么,Spring会强制使用CGLib来实现动态代理。
JVM内存模型
类加载器、本地接口、执行引擎、方法区、堆、虚拟机栈、本地方法栈、程序计数器
为什么要有JMM
保证原子性、可见性和有序性
synchronized在项目哪里用到的
如果你这个项目集群化部署你这个锁还有什么用
采用分布式锁
Redis分布式锁原理了解过吗
底层原理是redis的单线程保证了并发环境下的原子性
Redis之后引入了多线程,这和你提到单线程有啥区别
- 在高并发场景下,传统的单线程模型在处理大量网络请求时可能会遇到瓶颈。多线程模型允许多个线程同时处理不同的网络请求,从而大大提高了网络I/O的吞吐量。
Redis 为「关闭文件、AOF 刷盘、释放内存」这些任务创建单独的线程来处理,是因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞。
- 其核心操作主要基于单线程模型。Redis 单线程指的是「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」这个过程是由一个线程(主线程)来完成的。
mysql中唯一索引和主键索引有什么区别
1. 唯一性要求
- 主键索引:要求索引列的值在整个表中是唯一的,且任何两行数据的主键值都不能相同。同时,主键索引列的值不允许为空(NULL),即每一行都必须有一个主键值。
- 唯一索引:也要求索引列的值是唯一的,但允许部分行没有索引值,即允许索引列的值为空(NULL)。这意味着可以有多个行的索引列为空,但非空值必须是唯一的。
2. 表中数量
- 主键索引:每个表只能有一个主键索引,用于唯一标识表中的每一行数据。
- 唯一索引:一个表中可以有多个唯一索引,允许在多个列或列组合上设置唯一性约束。
3. 索引类型
- 主键索引:不仅是一种约束,还是一种特殊的索引类型,即聚集索引(Clustered Index)。在聚集索引中,数据行的物理顺序与主键的逻辑顺序一致。
- 唯一索引:通常是非聚集索引(Non-clustered Index),这意味着数据行的物理顺序与索引的创建顺序或插入顺序无关。不过,需要注意的是,在某些数据库管理系统中,如果表没有定义主键或聚集索引,系统可能会选择唯一索引作为聚集索引的候选者(但这并不是MySQL的默认行为)。
4. 自动增长
- 主键索引:通常情况下,主键索引会使用自动增长(AUTO_INCREMENT)属性来生成唯一的主键值,特别是在主键为整数类型时。
- 唯一索引:并不强制要求使用自动增长属性,其值可以由用户手动指定或根据业务规则生成。
你在表里加索引的规则是什么
1. 主键和外键索引
- 主键索引:表的主键必须建立索引。主键是表中每一行的唯一标识,通过索引可以快速定位到表中的任何一行。
- 外键索引:外键列通常也应该建立索引。外键用于维护不同表之间的参照完整性,索引可以加速外键约束的检查过程。
2. 数据量考虑
- 对于数据量超过一定阈值(如300行)的表,建议考虑添加索引以优化查询性能。然而,这个阈值并不是绝对的,需要根据实际情况和数据使用模式来判断。
3. 连接字段索引
- 如果表经常与其他表进行连接操作,那么在连接字段上应该建立索引。这样可以加速连接查询的速度。
4. 查询条件索引
- 经常出现在WHERE子句中的字段,特别是大表的字段,应该建立索引。这样可以减少数据库在查询过程中需要扫描的数据量,从而提高查询效率。
5. 选择性高的字段索引
- 索引应该建在选择性高的字段上。选择性高的字段意味着该字段的唯一值比例较高,索引的效果会更好。
数据量大了之后sql语句效率降低,你对sql语句优化上面有什么了解
主键索引: 聚簇索引上存储了全部数据, 相比普通索引查询, 减少了回表的消耗.
主键自增。不自增会导致页分裂。页分裂还有可能会造成大量的内存碎片,导致索引结构不紧凑,从而影响查询效率。
前缀索引,使用字符串的前几个字符作为前缀索引,提高查询速度。
索引下推, 索引下推是把本应该在 server 层进行筛选的条件,下推到存储引擎层来进行筛选判断,这样能有效减少回表。
索引覆盖避免回表。
最左前缀匹配原则
小表驱动大表:
in
适用于左边大表,右边小表。exists
适用于左边小表,右边大表。为经常需要排序、分组、查询和联合操作的字段建立索引
选择区分度高的列作为索引
联合索引将高频字段放在最左边
加索引就比不加索引快吗
- 小表:对于包含少量记录的小表,索引可能不会带来明显的性能提升,因为全表扫描已经足够快。
- 低选择性列:如果索引列包含大量重复值(即选择性低),则索引可能不是最佳选择,因为查询优化器可能会选择忽略它。
- 频繁更新的列:在频繁更新的列上创建索引可能会降低数据修改操作的性能,因为索引也需要被频繁更新。
mysql中char和varchar有什么区别,知道长度后选什么
Char(10)表示10位固定字符串,不满10则补空格。
varchar(10)表示存储10个变长的字符,存储多少个就是多少个,空格也按一个字符存储,这一点是和char(10)的空格不同的,char(10)的空格表示占位不算一个字符
知道长度选char