杭州2023 - Java开发 - 面试复盘 1

公司概况:不需要融资·1000-9999人·计算机软件 

1 项目

1. 你在项目里做过什么最能体现你的能力的事情?

    我想表达我做的是核心业务,就讲了讲我们的项目主要是做什么的,我做的是其中的哪一部分,但这样讲的效果并不好,面试官觉得没有体现出我做了哪些实际的工作。

    我应该从迭代开发的角度切入:“我入项的时候,项目一期刚结束,二期正要开始,我们的工作形式是迭代开发,我主要负责XXXX、XXXX、XXXX相关的需求,它们的主题都是信息安全管控。”然后开始聊具体的工作内容。

2. 你处理过什么线上问题?

    最好说线下复现不了的问题。

1) 线上任务执行结束后,本应给用户发送钉钉通知,但没有。

    是因为预发环境和正式环境使用的是同一数据库,推到预发环境的定时调度,执行时拉起待通知的任务进行了处理。而预发环境设置了钉钉通知白名单,目的是在开发过程中,不会打扰到开发人员以外的用户。在处理待通知任务时,通知消息就被白名单拦截了。

2) 在事务中进行了远程调用,事务回滚了但远程调用没有回滚。

    调用的服务并不支持事务,所以没有解决事务回滚的问题,最后是采取了折衷的办法,出现异常时,再次发送请求使系统回复到正常状态。

3) 再收集一些其他的。

2 多线程

1. 说说读写锁。它是怎么实现的?

    JUC包提供的可重入锁的两个子类,可重入读锁和可重入写锁。读锁共享、写锁排他。

    实现原理是AQS。

2. 线程池的线程是怎么开启和关闭的?是怎么完成交给它的任务的?

    开启:线程工厂,关闭:超时时间、时间单位。

    从线程池7个参数切入,讲清楚线程池的工作原理。

3 设计模式

1. 你知道哪些设计模式?

    建造者、单例、代理、模板、状态、策略、装饰器、门面、责任链等等。

【复盘】我在工作中是有一些使用设计模式重构代码的经验的,可以说这是我比较擅长的部分,如果我能结合工作实际来讲一讲,一定会是面试过程中的亮点,可是我没有过多地去表现。面试官抽查了其中两个,觉得我背得还算可以。

2. 说说策略模式。它是怎么实现的?

    把算法从代码中解耦出来,比如线程池参数里边的拒绝执行策略。

    可以先创建一个接口,然后创建几个实现类,把接口对象作为参数传入,根据里氏替换原则,可以替换成所有的实现类对象。

3. 说说模板模式。

    一个比较复杂的业务,它的步骤是比较固定的,可以在实现业务之前,创建一个模板类,对业务的每个步骤做一个基本的实现,然后继承这个模板类,重写里面的方法。

4 分布式 + Spring Cloud

1. 什么是CAP?

    在一个分布式架构中,一致性、可用性、分区容错性 三者只能同时满足其中的两个。

    在分布式架构中,分区容错性是必须保证的,所以就只能在一致性和可用性中做选择。

    有一个BASE理论,即使不能保证强一致性,也可以根据自身的业务特点,做到最终一致。

2. Eureka和Zookeeper分别保证的是AP还是CP?

    Eureka保证了AP,Zookeeper保证了CP,Nacos既可以保证AP,也可以保证CP。

1) Eureka保证AP。

    自我修复机制:当一个服务节点宕机时,自动切换到新的服务节点。

2) Zookeeper保证CP。

    ZAB协议:主从复制、ACK响应机制、过半原则、两阶段提交等等。

    Zookeeper选举期间,不能保证可用性(A)。

3) Nacos既可以保证AP,也可以保证CP。

    保证AP时遵循Distro协议,保证CP时遵循Raft协议。

    使用一个布尔值来控制,默认保证AP。

3. 你在使用Spring Cloud的时候遇到过什么问题?

1) Feign远程调用时请求头丢失。

    当使用Feign做远程调用时,会构造一个新的请求发送给远程服务,新请求的请求头中没有原来的cookie信息,导致远程服务无法检测到用户的登录状态。

    解决方法是向Web容器注入一个请求拦截器,获取cookie,给Feigh创建的请求带上。

2) 觉得上面的问题比较简单,想一想有没有其他更好的回答。

4. Spring事务不生效的场景有哪些?

1) 数据库引擎不支持事务。

    MyISAM 引擎不支持事务,InnoDB支持。

2) 事务没有被Spring管理。

    事务方法所在类缺少@Service注解。

3) 内部调用问题。

    Spring事务是通过AOP实现的,所以只有从外部调用事务方法时,事务才会生效,内部调用时,不会经过Spring的代理类,事务不会生效。

4) 事务方法的访问权限不是public。

5) 异常已被处理。

    相当于事务成功。

5. 查询的数据来自不同的微服务怎么解决?

    微服务之间互相发送请求。

    可以使用Feign这样的中间件。

5 MyBatis

对这块内容缺乏准备。

6 MySQL

1. 索引失效的场景。

    select *;

    模糊匹配通配符以%开头;

    复合索引不遵守最左前缀原则;

    在where条件中使用函数或not in;

    使用order by不加where或limit,或不遵守最左前缀原则;

    使用or关键字,前后都必须满足索引条件。

2. left join为什么用小表join大表?

    减少创建表连接的次数,加快查询速度。

3. left join把条件写到where和on后边有什么区别?

    on条件是在生成临时表时使用的条件,不管on中的条件是否为真,都会返回被驱动表中的记录;

    where条件是在临时表生成以后再进行过滤,条件不为真就全部过滤掉。

7 Redis

1. Redis有哪4种数据结构?ZSet解决了什么问题?

    String、Hash、Set、ZSet。

    ZSet解决了排序问题。

2. Redis有哪些数据持久化的方式?

    RDB和AOF。

    RDB在两次快照之间的操作可能会丢失,AOF记录每一次操作,所以不会有丢失的问题,但AOF消耗的资源会多一些。

3. Redis集群为啥至少6台机器?

    搭建三主三从集群。

    3个主节点,3个从节点。一旦有主节点发生故障,选举对应的从节点成为新的主节点,继续对外服务。

8 Elasticsearch

1. 引入ES主要解决什么问题?

    优化检索。

2. 为什么ES比MySQL检索快?

    倒排索引、分词检索。

    把检索的关键词进行分词处理,然后分别检索每一个分词所在的文档。通常一个文档中包含的分词越多,相关性就越高,根据相关性得分对检索结果进行排序。

3. match。

    匹配字符串。

9 总结

和面试官交流的过程中有种一问一答的感觉,不会主动地展示自己。

如果讲的话比较少,面试官就很难从中挖掘出你有什么能力。需要认真地考虑下,如何在面试官抛出一个话题后,围绕着话题滔滔不绝地讲20分钟。

1) 可以讲一些相关的知识,主动去发散,给面试官一些提问的方向;

2) 可以讲讲你在工作过程中使用相关的知识解决过什么实际问题,这个讲好了就是面试亮点;

3) 等等。

你可能感兴趣的:(项目实战,java,求职招聘)