主题
盒马鲜生(一面) 待完善
日期
2024 年 10 月 21 日
面向对象和面向过程的区别
- 面向过程将问题拆成多个方法调用
- 面向对象会先抽象出对象,通过调用对象的方法解决问题
ArrayList 和 LinkedList 的区别
- 数据结构:ArrayList 使用数组,LinkedList 使用双向链表
- 性能:ArrayList 对于查询性能高,LinkedList 插入删除性能高
- 空间:ArrayList 会存在预留位置,LinkedList 数据需要携带前驱后继。
HashMap 的长度为什么时 2 的幂次方
哈希表使用哈希值取模运算来确定元素存储的位置,当 HashMap 长度是 2 的幂次方时,取模操作能转化为位运算,提高操作效率。
【TBD】Spring 为什么提供了 AOP,而不使用 JDK 动态代理?
TBD...
线程池的核心线程数是如何设置?
- CPU 密集型:核心数 + 1
- IO 密集型:核心数 * 2
- 根据生产者消费者关系:根据消费者数量配置核心线程数
Spring 事务失效的原因,
使用代理对条调用带事务的方法
- 方法内的自调用(注解失效):必须是代理对象执行的方法才有事务
- 把方法拆分到另一个类,然后注入代理对象调用
- 注入本类的代理对象
- 方法修饰符是 private/final:Spring 事务由 CGLIB 动态代理通过继承实现,private 则子类无法重写方法。
- 方法内捕获异常
- 类没有被 Spring 管理:
- 其他线程的调用
Spring 如何解决循环依赖
三级缓存
主要问题:死借环依赖、AOP 代理
- 单例池:存放创建完成的 Bean 可被其他对象注入。
- 半成品池:中间状态的 Bean,末进行依赖注入的代理对象/普通对象。
- 工厂池:获取对象的 lambda
Bean 创建过程:提前引1用(放入工厂池)、实例化(实例化后放入半成品池)、填充属性(单例池 & 半成品池)、初始化、后置处理(创建代理对象)
泛型是什么?有什么优点?
泛型可以用在类、接口、方法上,可以在创建对条或调用方法时才确定具体类。
泛型的优点:
- 进行类型的限制,相比 Object 提供了编译时的类型检查
- 避免使用 Object 造成强制类型转换
- 提高代码可读性。
Java 内存模型
- 方法区(通过永久代/元空间实现):类对象、常量、常量池、静态变量。
- 程序计数器
- 虚拟机栈
- 本地方法栈
- 堆
方法区、永久代和元空间的关系
方法区是逻辑上的区域,存储类结构信息、静态变量、常量池等。
Java 8 之前通过永久代实现方法区,厲于堆内存的一部分。
元空间是 Java8 对方法区的实现,使用本地内存。
【TBD】RabbitMQ 如何保证消息不丢失?
TBD...