面试真题之收钱吧问题与总结

收钱吧面试技术笔记​编辑

1. 线程安全相关

什么叫线程安全

线程安全指的是多个线程访问同一个资源时,不会引起数据不一致或者程序异常的行为。实现线程安全的方式有:

  • 互斥锁(synchronized、ReentrantLock)
  • 原子操作(AtomicInteger 等)
  • 线程安全的数据结构(ConcurrentHashMap)

2. Java 基本类型及包装类

基本类型 包装类 说明
byte Byte -
short Short -
int Integer -
long Long -
float Float -
double Double -
char Character -
boolean Boolean -

使用场景

  • 当需要使用泛型(Collection 只能存对象)
  • 需要对象方法(如 Integer.parseInt()
  • 与反射或框架交互

包装类线程安全吗?

  • 不可变对象 → Integer、Long、String 等都是线程安全的
  • 注意:线程安全只针对对象不可变性,引用本身的赋值不是线程安全的

除了不能修改值,还不能修改什么

  • 对象的内部状态不可变
  • 没有 setter 或修改内部数组/集合的接口

​编辑

3. String 与线程安全

为什么 split 方法线程安全

  • String 是不可变对象
  • split 返回的是新的数组或字符串,不会修改原字符串
  • 线程安全来源于对象不可变性

4. 线程池

线程池主要参数(以 Java ThreadPoolExecutor 为例)

text 复制代码
corePoolSize:核心线程数  
maximumPoolSize:最大线程数  
keepAliveTime:非核心线程空闲存活时间  
unit:时间单位  
workQueue:任务队列  
threadFactory:线程创建工厂  
handler:拒绝策略  

创建线程时,是先放队列还是先放线程

  • 如果当前线程数 < corePoolSize → 创建核心线程
  • 超过 corePoolSize → 放入队列
  • 队列满 → 创建非核心线程(直到 maximumPoolSize)
  • 超过 maximumPoolSize → 执行拒绝策略

IO 密集型线程池参数设置

  • 核心线程数可以设大一些(CPU × 2 或更多)
  • 使用 LinkedBlockingQueue 避免阻塞

保证核心线程不销毁

  • allowCoreThreadTimeOut(false)(默认 false)

5. Java POJO 与 HashCode/Equals

POJO 是否要重写 hashCode 和 equals

  • 必须重写:存入 HashMap、HashSet 或需要按内容比较对象时
  • 不必要:只是普通存储或不比较对象的场景

除了判断相等情况下,是否有必要重写

  • 可以不重写,除非你需要放入 hash 系列集合或者基于对象内容比较

6. 数组与字符串

数组 length 和字符串 length 区别

  • 数组:arr.length → 属性
  • 字符串:str.length() → 方法

数组元素如何存储

  • 数组连续存储在堆中,元素可以是基本类型或对象引用 编辑

7. 反射与类加载器

反射

  • 获取类信息:Class<?> clazz = Class.forName("com.example.MyClass");
  • 创建对象:clazz.newInstance()
  • 调用方法、获取字段、修改字段

ClassLoader 和 Class 区别

  • Class:类的字节码对象,Java 层抽象
  • ClassLoader:负责加载字节码文件到 JVM
  • 两者都可以用于加载类,但 ClassLoader 更底层

8. 单例模式

常见场景

  • 全局配置对象
  • 线程池、缓存管理

最简单实现(懒汉/饿汉)

java 复制代码
// 饿汉  
public class Singleton {  
    private static final Singleton INSTANCE = new Singleton();  
    private Singleton() {}  
    public static Singleton getInstance() {  
        return INSTANCE;  
    }  
}  

9. HTTP 与 TCP

HTTP 版本区别

版本 特点
1.0 每次请求创建新 TCP 连接
1.1 支持 Keep-Alive、管道化
2.0 二进制帧、多路复用、头部压缩

TCP 实现 HTTP

  • 理论上用 Socket 建立 TCP 连接,手动发送 HTTP 请求报文
  • Java 示例略(面试一般不要求完整实现)

10. 数据库 ACID 与事务

ACID

  • Atomicity 原子性
  • Consistency 一致性
  • Isolation 隔离性
  • Durability 持久性

事务隔离级别

隔离级别 现象
READ UNCOMMITTED 脏读
READ COMMITTED 不可重复读
REPEATABLE READ 幻读
SERIALIZABLE 串行化

不同隔离级别下锁

  • 读锁、写锁、间隙锁(防止幻读)

千万级数据表索引策略

  • 自增 ID → 主键索引
  • 年龄 → 可加普通索引,考虑范围查询
  • 不建议频繁变化字段建索引

事务传播机制

  • 默认:REQUIRED
  • 并发事务修改:数据库通过锁和隔离级别解决,也可通过乐观锁/悲观锁在代码控制

相关推荐
2601_949817721 天前
Spring Boot3.3.X整合Mybatis-Plus
spring boot·后端·mybatis
uNke DEPH1 天前
Spring Boot的项目结构
java·spring boot·后端
zhenxin01221 天前
Spring Boot 3.x 系列【3】Spring Initializr快速创建Spring Boot项目
spring boot·后端·spring
超级无敌暴龙兽1 天前
和我一起刷面试题呀
前端·面试
前端一小卒1 天前
前端工程师的全栈焦虑,我用 60 天治好了
前端·javascript·后端
不停喝水1 天前
【AI+Cursor】 告别切图仔,拥抱Vibe Coding: AI + Cursor 开启多模态全栈新纪元 (1)
前端·人工智能·后端·ai·ai编程·cursor
oyzz1201 天前
Spring EL 表达式的简单介绍和使用
java·后端·spring
zhenxin01221 天前
【wiki知识库】07.用户管理后端SpringBoot部分
spring boot·后端·状态模式
码事漫谈1 天前
OpenSpec 简明教程
后端
程序员小假1 天前
向量检索的流程是怎样的?Embedding 和 Rerank 各自的作用?
java·后端