字节实习Java后端二面 45min
1.项目介绍
2.实习项目细节拷打(问了需求里的功能指标怎么做的,上线流程是怎么做的,上线是否存在问题等)
3.Spring的AOP是什么?底层是怎么实现的?
4.你用过Spring有哪些注解?@Autowired和@Resource的区别是什么?
5.项目有哪些场景使用了分布式锁?还知道其他分布式锁的实现方式吗?
6.大任务拆分为多个小任务执行可以使用什么多线程框架?CompletableFuture有线程池吗?
7.redis有哪些数据类型?跳表是怎么设计的?布隆过滤器怎么设计的?
8.简历上算法专利细节提问和论文算法实现细节提问
9.算法题:链表重排
2.实习项目细节拷打(问了需求里的功能指标怎么做的,上线流程是怎么做的,上线是否存在问题等)
3.Spring的AOP是什么?底层是怎么实现的?
4.你用过Spring有哪些注解?@Autowired和@Resource的区别是什么?
5.项目有哪些场景使用了分布式锁?还知道其他分布式锁的实现方式吗?
6.大任务拆分为多个小任务执行可以使用什么多线程框架?CompletableFuture有线程池吗?
7.redis有哪些数据类型?跳表是怎么设计的?布隆过滤器怎么设计的?
8.简历上算法专利细节提问和论文算法实现细节提问
9.算法题:链表重排
全部评论
3. Spring的AOP是什么?底层是怎么实现的?
AOP(面向切面编程) 是Spring框架的核心功能之一,用于将横切关注点(如日志、事务、安全等)与核心业务逻辑分离,通过动态代理实现代码的模块化。
底层实现方式:
1. JDK动态代理:基于接口实现,通过
"java.lang.reflect.Proxy"生成代理对象,要求目标类必须实现接口。
2. CGLIB动态代理:基于继承实现,通过生成目标类的子类来增强方法,适用于无接口的类。
- Spring默认优先使用JDK动态代理,若目标类未实现接口则自动切换为CGLIB。
核心流程:
- 通过
"BeanPostProcessor"在Bean初始化前后介入,生成代理对象。
- 代理对象调用方法时,会触发
"MethodInterceptor",执行增强逻辑(如@Before、@After等)。
4. 常用Spring注解及@Autowired与@Resource的区别
常用注解示例:
- 配置类:
"@Configuration",
"@ComponentScan",
"@Bean"
- 组件扫描:
"@Component",
"@Service",
"@Repository",
"@Controller"
- 依赖注入:
"@Autowired",
"@Resource",
"@Value"
- AOP:
"@Aspect",
"@Before",
"@After",
"@Around"
- 事务:
"@Transactional"
@Autowired与@Resource的区别:
特性 @Autowired (Spring提供) @Resource (JSR-250标准)
来源 Spring框架 Java EE标准,Spring支持
默认注入方式 按类型(byType) 按名称(byName),失败时按类型
是否必须 默认required=true,可设false 默认必须存在,可设
"nullable"
指定名称 需配合
"@Qualifier" 直接通过
"name"属性指定
适用场景 推荐Spring项目使用 需兼容Java EE或明确按名称注入时
5. 分布式锁场景及实现方式
常见使用场景:
- 秒杀系统扣减库存(防超卖)
- 定时任务集群防重复执行
- 分布式系统并发控制(如修改共享配置)
实现方式:
1. Redis分布式锁:
- 使用
"SET key value NX PX timeout"(原子操作)
- 需解决锁续期(如Redisson的WatchDog)和释放非自身锁的问题
2. ZooKeeper分布式锁:
- 基于临时顺序节点,最小节点获取锁
- 通过Watch机制监听节点删除
3. 数据库分布式锁:
- 基于唯一索引或乐观锁版本号
- 性能较低,适合并发量小的场景
4. Etcd分布式锁:基于Raft协议,强一致性
6. 多线程框架及CompletableFuture线程池
大任务拆分框架:
- Java原生:
"ExecutorService" +
"Future"
- CompletableFuture(推荐):支持异步回调、组合任务
- 并行流ParallelStream:底层使用ForkJoinPool
- 第三方框架:RxJava、Akka、Netty(事件驱动)
CompletableFuture线程池:
- 默认使用
"ForkJoinPool.commonPool()"(守护线程,核心数=CPU-1)
- 可通过
"supplyAsync(Supplier, Executor)"指定自定义线程池
- 注意:避免I/O密集型任务阻塞默认线程池,建议自定义线程池
7. Redis数据类型及数据结构设计
Redis数据类型:
- String(字符串)、List(列表)、Hash(哈希)、Set(集合)、ZSet(有序集合)
- 扩展类型:Bitmaps(位图)、HyperLogLog(基数统计)、Geospatial(地理空间)
跳表(SkipList)设计(ZSet底层实现之一):
- 多层索引结构,每层为有序链表
- 插入时随机生成层高(概率1/4晋升)
- 查询时间复杂度O(log n),空间复杂度O(n)
- 相比平衡树,实现简单且支持范围查询
布隆过滤器(Bloom Filter)设计:
- 位数组 + k个哈希函数
- 添加元素:计算k个哈希值,将对应位置1
- 判断存在:检查k个位置是否均为1(可能误判,但不会漏判)
- 优点:空间效率高;缺点:不支持删除,存在误判率
mark
mark
能说清底层实现的才是真有技术积累
mark
相关推荐
西安中熔电气 管培生 22-24W,1.2Wx14-16+600x12(饭卡补助)+单项奖 硕士211 点赞 评论 收藏
分享
查看1道真题和解析