2022/3/8 面试自我 总结
final 的 修饰
- final 修饰类中的属性
表示该属性一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对对象属性来说其引用不可再变。其初始化可以在两个地方:一是其定义处,也就是说在 final 属性定义时直接给其赋值;二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时赋值,又在构造函数中赋予另外的值。 - final 修饰类中的方法
说明这种方法提供的功能已经满足当前要求,不需要进行扩展,并且也不允许任何从此类继承的类来重写这种方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。在声明类中,一个 final 方法只被实现一次。 - final 修饰类
表示该类是无法被任何其他类继承的,意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。
private 被修饰过后 能不能被继承?
我们其实知道static 修饰的方法都是可以进行被继承使用的,但是private 修饰词呢?其实继承的关系来说,多态创建子类 时候 要先 父类进行创建,所以按道路来说应该是要被继承的,同时向上转型的时候,才能不会报错啊,毕竟 这是父类的属性?可以是为什么 子类不能使用父类的方法呢?
我们通过 private、default、protect、public关键字可以知道,private 只能用在同一个类下面,所以 子类 其实根据多态的属性来说 是被继承的了,但是 不会被显示出来,除非 调用的方法在同一类下面。所以 同理对于protect 而言。
数据库 为什么 不走索引?
- 过时的统计信息。如果你的数据库 auto-vacuum 选项是打开的, 那么就不会引起这个问题的发生。但是如果你最近刚批量的导入数据,且新建了索引,那么很有可能,统计信息过期,导致查询优化器不能获得最新的统计信息,做出正确的判断。
- 查询谓词没有使用索引的主要边界,换句话说就是select *,可能会导致不走索引。
- 单键值的b树索引列上存在null值,导致COUNT()不能走索引。如果在B树索引中有一个空值,那么查询诸如SELECT COUNT() FROM T 的时候,因为HASHSET中不能存储空值的,所以优化器不会走索引,有两种方式可以让索引有效,一种是SELECT COUNT(*) FROM T WHERE XXX IS NOT NULL或者把这个列的属性改为not null (不能为空)。
- 索引列上有函数运算,导致不走索引
- 隐式转换导致不走索引。就是 where x = 5 的条件,但是x是varchar ,所以 5要进行转化
- !=或者<>(不等于),可能导致不走索引,也可能走 INDEX FAST FULL SCAN
- 表字段的属性导致不走索引,字符型的索引列会导致优化器认为需要扫描索引大部分数据且聚簇因子很大,最终导致弃用索引扫描而改用全表扫描方式
- 其它资料 :外部资料
SpringMVC 接受 对象,不是json格式的对象。
实例化对象,其实就是和 接受文件一样的道理,通过接收文件进行处理相关请求
SpringMVC接受实例化对象
SpringMVC 接受 前端传来的多个json格式对象?
其实就是字符串处理的方式了。
处理方式
线程池执行逻辑
类锁 和 对象锁 会产生阻塞问题 和 死锁问题吗?
类锁 和 对象锁 不是 同一个锁,所以不会产生阻塞问题。
对于死锁的产生有四个必要的条件
- 互斥使用,即当资源被一个线程占用时,别的线程不能使用
- 不可抢占,资源请求者不能强制从资源占有者手中抢夺资源,资源只能由占有者主动释放
- 请求和保持,当资源请求者在请求其他资源的同时保持对原因资源的占有
- 循环等待,多个线程存在环路的锁依赖关系而永远等待下去,例如T1占有T2的资源,T2占有T3的资源,T3占有T1的资源,这种情况可能会形成一个等待环路
所以可以看出 类锁和 对象锁 互斥,是有导致死锁的可能的,但是 如果你的函数写的 外部调用类锁,内部调用 对象锁,而对于 另一个方法来说,你外部是对象锁,内部是类锁,是存在死锁的的可能的。同理 如果 你外部是一个实例化锁,内部是一个是实例化锁,可以通过 同步代码块进行设置导致死锁