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

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

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
  • 并发事务修改:数据库通过锁和隔离级别解决,也可通过乐观锁/悲观锁在代码控制

相关推荐
MicrosoftReactor几秒前
技术速递|GitHub Copilot SDK 与混合 AI 实践:README 到 PPT 的自动化转换流程
人工智能·github·copilot
爱敲代码的憨仔10 分钟前
Spring-AOP
java·后端·spring
阿拉伯柠檬11 分钟前
Git原理与使用(一)
大数据·linux·git·elasticsearch·面试
短剑重铸之日13 分钟前
《设计模式》第四篇:观察者模式
java·后端·观察者模式·设计模式
Hx_Ma1620 分钟前
SpringBoot注册格式化器
java·spring boot·后端
阿里嘎多学长23 分钟前
2026-02-02 GitHub 热点项目精选
开发语言·程序员·github·代码托管
jiayong2324 分钟前
Vue2 与 Vue3 生态系统及工程化对比 - 面试宝典
vue.js·面试·职场和发展
乔江seven24 分钟前
【python轻量级Web框架 Flask 】1 Flask 初识
开发语言·后端·python·flask
蒹葭玉树33 分钟前
【C++上岸】C++常见面试题目--操作系统篇(第二十九期)
java·c++·面试
知识即是力量ol33 分钟前
一次完整的 Spring Security JWT 鉴权链路解析
java·后端·spring·鉴权·springsecurity