20210519面试总结

面试总结

面试总结,答案是请教他人或者网上找的,仅供参考

索引最左匹配原则

当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

2个长度10w的数组,求交集元素

使用Map,数组作为键值key,计数器作为value使用Map,数组作为键值key,计数器作为value

数组与链表存取对比,以及内存空间的区别

数组静态分配内存,在内存中是连续的,数组随机访问性比较强,可以通过下标进行快速定位,查找速度快;但是插入和删除的效率低,需要移动其他元素,会造成内存的浪费;
链表动态分配内存,在内存中是不连续的。链表插入和删除的效率高,只需要改变指针的指向就可以进行插入和删除;内存利用率高,不会浪费内存。但是查找的效率低,因为链表是从第一个节点向后遍历查找。

synchronized与volatile区别

1)volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从主存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
2)volatile仅能使用在变量级别,synchronized则可以使用在变量、方法。
3)volatile仅能实现变量的修改可见性,而synchronized则可以保证变量的修改可见性和原子性。
4)volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞。

synchronized和lock区别

1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
5)Lock可以提高多个线程进行读操作的效率

怎么保证接口的幂等性

接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
1、通过代码逻辑判断实现,只能针对一些满足判断的逻辑实现,具有一定局限性。
2、使用token机制实现。
实现步骤:
生成全局唯一的token,token放到redis或jvm内存,token会在页面跳转时获取。存放到pageScope中,支付请求提交先获取token;
提交后后台校验token,执行提交逻辑,提交成功同时删除token,生成新的token更新redis,这样当第一次提交后token更新了,页面再次提交携带的token是已删除的token后台验证会失败不让提交。

redis的怎么做内存清理的

redis内存清理策略:定时器删除;惰性删除;定时扫描

redis内存满了且key都是有效的,再插入数据会怎样?

8种淘汰策略;(redis内存模型)

单例模式的优缺点

优点:减少内存开支;减少系统的性能开销;避免对资源的多重占用
缺点:没有抽象层,扩展很困难;单例类的职责过重,在一定程度上违背了“单一职责原则”

怎么去优化系统中的sql查询

定位慢查询,做sql优化

SQL优化?如果需要优化的sql已经加了索引还是很慢怎么办?

添加索引,优化查询条件减少全表扫描操作。

对象进入老年代的条件

1、对象经过几次垃圾回收,熬到设定的年龄阈值,就会晋升到老年代。
2、如果直接分配大对象,该大对象超出了JVM设置的限定值,就会直接分配到老年代。
3、新生代GC后,存活下来的对象太多,Survivor区放不下,此时对象直接晋升老年代。
4、在一次新生代GC后,Survivor区域中的几个年龄对象加起来超过了Survivor区内存的一半,那么根据动态年龄判定规则,从最小的年龄加起,比如年龄1+年龄2+年龄3的对象大小总和,超过了Survivor区内存的一半,此时年龄3以上的对象就会晋升老年代。

gateway作用?怎么限流

鉴权、路由、灰度发布、限流。
限流算法分类:限流算法、漏桶算法、令牌桶算法
限流算法:维护一个单位时间内的 Counter,如判断单位时间已经过去,则将 Counter 重置零。
漏桶算法:水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。
令牌桶算法:随着时间流逝,系统会按恒定时间间隔往桶里加入Token,如果桶已经满了就不再加了。新请求来临时,会各自拿走一个 Token,如果没有 Token 可拿了就阻塞或者拒绝服务。

springcloud的ribbon、hystrix 等与netty对比

vachar存储的内容长度大于多少的时候索引会失效

不同的存储引擎不同。
myisam存储引擎在创建索引的时候,索引键长度是有一个较为严格的长度限制的,所有索引键最大长度总和不能超过1000,而且不是实际数据长度的总和,而是索引键字段定义长度的总和。
InnoDB 引擎单一字段索引的长度最大为 767 字节,同样的,前缀索引也有同样的限制。当使用 UTF-8 字符集,每一个字符使用 3 字节来存储,在 TEXT 或者 VARCHAR 类型的字段上建立一个超过 255 字符数的前缀索引时就会遇到问题。可以启用服务器选项 innodb_large_prefix 使得这个限制增加到 3072 字节,而且表的 row_format 需要使用 compressed 或者 dynamic。

组件唯一id怎么实现?数据库id自增有什么优缺点?

MP内置id生成规则,UUID,雪花算法
id自增的优缺点:
优点:
1.自增,趋势自增,可作为聚集索引,提升查询效率。
2.节省磁盘空间。500W数据,UUID占5.4G,自增ID占2.5G。
3.查询,写入效率高:查询略优。写入效率自增ID是UUID的四倍。
缺点:
1.导入旧数据时,可能会ID重复,导致导入失败。
2.分布式架构,多个Mysql实例可能会导致ID重复。

你可能感兴趣的:(面试总结,java)