Skip to content

盒马鲜生(一面) 待完善

日期

2024 年 10 月 21 日

面向对象和面向过程的区别

  1. 面向过程将问题拆成多个方法调用
  2. 面向对象会先抽象出对象,通过调用对象的方法解决问题

ArrayList 和 LinkedList 的区别

  1. 数据结构:ArrayList 使用数组,LinkedList 使用双向链表
  2. 性能:ArrayList 对于查询性能高,LinkedList 插入删除性能高
  3. 空间:ArrayList 会存在预留位置,LinkedList 数据需要携带前驱后继。

HashMap 的长度为什么时 2 的幂次方

哈希表使用哈希值取模运算来确定元素存储的位置,当 HashMap 长度是 2 的幂次方时,取模操作能转化为位运算,提高操作效率。

【TBD】Spring 为什么提供了 AOP,而不使用 JDK 动态代理?

TBD...

线程池的核心线程数是如何设置?

  1. CPU 密集型:核心数 + 1
  2. IO 密集型:核心数 * 2
  3. 根据生产者消费者关系:根据消费者数量配置核心线程数

Spring 事务失效的原因,

使用代理对条调用带事务的方法

  1. 方法内的自调用(注解失效):必须是代理对象执行的方法才有事务
    1. 把方法拆分到另一个类,然后注入代理对象调用
    2. 注入本类的代理对象
  2. 方法修饰符是 private/final:Spring 事务由 CGLIB 动态代理通过继承实现,private 则子类无法重写方法。
  3. 方法内捕获异常
  4. 类没有被 Spring 管理:
  5. 其他线程的调用

Spring 如何解决循环依赖

三级缓存

主要问题:死借环依赖、AOP 代理

  1. 单例池:存放创建完成的 Bean 可被其他对象注入。
  2. 半成品池:中间状态的 Bean,末进行依赖注入的代理对象/普通对象。
  3. 工厂池:获取对象的 lambda

Bean 创建过程:提前引1用(放入工厂池)、实例化(实例化后放入半成品池)、填充属性(单例池 & 半成品池)、初始化、后置处理(创建代理对象)

泛型是什么?有什么优点?

泛型可以用在类、接口、方法上,可以在创建对条或调用方法时才确定具体类。

泛型的优点:

  1. 进行类型的限制,相比 Object 提供了编译时的类型检查
  2. 避免使用 Object 造成强制类型转换
  3. 提高代码可读性。

Java 内存模型

  1. 方法区(通过永久代/元空间实现):类对象、常量、常量池、静态变量。
  2. 程序计数器
  3. 虚拟机栈
  4. 本地方法栈

方法区、永久代和元空间的关系

方法区是逻辑上的区域,存储类结构信息、静态变量、常量池等。

Java 8 之前通过永久代实现方法区,厲于堆内存的一部分。

元空间是 Java8 对方法区的实现,使用本地内存。

【TBD】RabbitMQ 如何保证消息不丢失?

TBD...

Released under the MIT License.