3. 金证股份面试复盘
结果:
挂了,面试官觉得我八股不行,基础薄弱,不尊重他
时间
2023.2.25
心得
第一次线下面试,基础题没背太熟(八股一定要好好背,理解性记忆+部分死记硬背)
注: ----- 以下答案不再更新(考虑删除),统一在面试宝典中更新
重载和重写的区别?
首先他们都是实现多态的方式
然后说一下他们基本的概念
重载:
同一类中的同名函数,具有不同参数个数或类型(不要求返回值),由静态类型确定,属于静态分派
重写:
子类含有父类相同名字、返回类型、和参数列表,则为重写,属于动态分派;
重写要求子类重写方法更容易访问,不能抛出更多异常,以及访问修饰符的限制不能比父类小;
不同点:
重载是编译时多态性,重写是运行时多态性
重载发生在一个类中,重写发生在子类和父类之间
重载不要求返回类型,重写要求返回类型相同
构造器和静态方法能被重载,但不能被重写
注意点:重写的返回类型不要求完全一样
- 返回类型使用使用泛型
- 返回类型使用父类的子类
数据结构中,哪些是线程安全的,哪些是非线程安全的,能举两个例子吗?
ArrayList,HashMap,StringBuilder是非线程安全的;
vector,HashTable,StringBuffer是线程安全的;
什么是线程安全?(线程安全的特性)
线程安全是指某个方法或某段代码,在多线程中能够正确的执行,不会出现数据不一致或数据污染的情况,我们把这样的程序称之为线程安全的,反之则为非线程安全的。
线程安全的三大特性:原子性、可见性、有序性
原子性:一个或者多个操作,要么全部执行,要么全部不执行,可以通过各种锁去保证;
可见性:线程之间的可见性,一个线程状态的修改对另一个线程是可见的,可以通过 volatile 关键字去保证;
有序性:执行的顺序按照代码的先后顺序执行;
代理了解吗?动态代理有几种实现方式?
aop就是用的代理实现,代理分为静态代理和动态代理
静态代理比如 AspectJ,AOP框架会在编译阶段生成AOP代理类,属于编译时的增强
动态代理比如 jdk动态代理 和 CGLIB ,AOP框架不会去修改字节码,而是每次运行时在内存临时为方法生成一个AOP对象,AOP对象包含了目标对象的全部方法,在特定切点做了增强处理,并回调原对象的方法。
当时的回答:spring使用的就是动态代理,动态代理有两个:jdk自带的和Cglib,jdk的代理效率会高一些,Cglib是动态代码生成库。
为什么要加动态代理?
Spring框架使用代理模式来实现AOP,主要是因为:
- 代理模式可以在不修改原始对象的情况下实现横切逻辑的织入,使系统更加灵活和可靠。
- 代理模式可以代理接口和普通Java类,因此可以更加方便的使用。
- 代理模式可以对原始对象的方法进行拦截,从而实现AOP中定义的通用逻辑,大大提高了系统的复用性、可维护性和可扩展性。
- 由于静态代理需要特定的编译器进行处理,所以采用动态代理。
面试官提示:可以结合一下场景来说,为什么要用动态代理?我直接用类生成不行吗?
直接用类生成需要对原有类做修改,一般适用于修改量少的情况,如果修改的类较多就会导致代码难以维护。
当时的回答:动态代理是在运行时做一个代码的...不是很清楚
两种动态代理的优劣势是什么?
- 动态代理的两个方法:JDK动态代理和CGLIB动态代理
两种动态代理效果差不多,CGLIB由于不用实现接口,会方便一些。
分布式事务用到哪些组件?(待完善)
分布式事务理论:CAP理论和BASE理论
除银行项目等一些项目要求强一致性外,即CP模型,其他都是用的AP模型
组件:seata、hmily、raincat、myth等
分布式事务解决方案:2pc、3pc
当时的回答:项目上没用过,我了解分布式事务有很多组件,是使用ap协议去进行。a是高可用性,p是分区容错性。c(一致性)是通过最终一次性去保证的(面试官提示:不是问你这个,请听清楚题目啊)
cap为什么不能三个同时满足?
由于网络波动,无法保证分区容错性(P),所以无法保证CA
举了例子:如果系统出现“分区”,系统中的某个节点在进行写操作。为了保证C(一致性),必须要禁止其他节点的读写操作,这就和A发生冲突了。如果为了保证A,其他节点的读写操作正常的话,那就和C发生冲突了。
ACID 是数据库事务完整性的理论,CAP 是分布式系统设计理论,BASE 是 CAP 理论中 AP 方案的延伸。
当时的回答:由于网络波动,无法保证一致性(c)
举几个锁,并说一下使用场景?
悲观锁:对数据库的表进行更新操作,会对加行锁,也可以手动加表锁:select for update 手动加锁
为什么要手动加锁?
rc隔离级别下保证数据一致性
乐观锁:使用 CAS机制和表字段去控制,防止对表的操作发生冲突。
可重入锁:可以用在分布式锁中
分布式锁:
当时错误的回答:
说了分布式锁
面试官提示:可以结合业务场景去说
业务场景:防止用户点击多次,要保证只有一个请求能进方法里面(这里应该是同单据number下),需要加分布式锁,用单据号作为分布式锁的key,原理采用到了 ReentrantLock ,以及lua脚本去保证它的原子性
分布式锁用什么实现的?
当时的回答:公司封装了分布式锁的相关工具类,具体是用红锁(redLock)实现的
分布式锁怎么保证跨服务的一个情况?
通过第三方服务比如 reids 去共享锁,保证同一时刻只能有一个实例能够获取到锁。
当时无用的回答:我的场景不需要跨多个服务,说了redLock在网上有一些争议,但是还好(弄清楚有什么争议?),redLock有一个哨兵机制去进行选举,票数多才能获得锁。
用的mysql几?
5.7
mysql5.7和8.0的区别是什么?
对 InnoDB 做了很多优化,还有就是隔离级别的不同,mysql5.7默认rr,8.0默认rc
对单表建索引,有什么要求跟限制吗?
看具体业务场景,一般在搜索常用的字段加索引,并且字段的区分度要比较高。这样在索引树上的搜索的效率会高很多。(个人感觉回答的还行)
怎么看执行计划?
通过 EXPLAIN 关键字去查看 sql 的执行计划,看是否走索引,没有走索引的原因是什么,以及哪些表的执行时间比较高,去做一个针对性优化。
实际案例是,oracle那边一段sql由于数据量比较大,而且没有走索引,解决方案是改为精确搜索,就走了索引,时间从200多秒下降到2秒多。
面试官评价
个人很自信,(这里不能打断面试官),回答问题要尽量从真实经历去切入。
纠正说话
不要额这些语气词
一句话不连贯,说到一半开始想
吸鼻子
紧张
不要当场请教问题(摆正态度,我是去面试的,而且有些问题面试官也懒得理你)
少说“就是”
#如何判断面试是否凉了##牛客在线求职答疑中心##牛客解忧铺#