本文最后更新于30 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
- java基本数据类型:八种+包装
- float和double哪个表示精度更大一点?默认精度double更高,但底层表示分为符号位,尾数和基数,可能损失精度
回答正确,但术语不准确,建议这样说:
- double 精度更高,64 位(1 + 11 + 52),比 float 的 32 位(1 + 8 + 23) 更精确。
- 浮点数采用 IEEE 754 标准,由:
- 1 位符号位(Sign)
- 若干位阶码(Exponent)
- 若干位尾数(Mantissa,Significand)
- 如果不损失精度应该用什么?Bigdecimal或者不用小数,转换为int
- 使用 BigDecimal(String) 构造函数(避免使用 double 构造)。
- 或将价格/金额类字段 统一扩大倍数(如:×100)存整数,避免小数误差。
- 什么是面向对象?封装(
对扩展开放对修改关闭)继承(子类父类)多态(子类重写重载)- 封装:隐藏实现细节,仅暴露接口。通过 private + public getter/setter 实现数据访问控制。
- 继承:子类继承父类,复用代码。
- 多态:
- 编译时(重载 Overload)
- 运行时(重写 Override,通过父类引用调用子类方法)
- 重载重写区别?重载同一类,方法名相同形参不同,重写指子类重写父类方法,方法名形参返回值均需与父类保持一致(子类访问控制权限不能更严格,异常不能更宽泛。)
- 一个子类可以有多个父类吗?不可以 java不支持多继承,
会出现菱形继承问题,可以利用接口实现多继承
一文学会Java 8 菱形继承问题_java菱形继承-CSDN博客
- 接口和抽象类区别?抽象类可以定义抽象和非抽象方法,接口只能定义抽象方法,但后面支持默认和私有方法,两者区别主要是使用思想不同

- final修饰类和方法的区别?修饰类表示无法继承(如String类),修饰方法不可改写
- hashmap的工作原理:底层数组+链表(1.7前),数组+链表+红黑树(1.8),哈希函数计算hashcode(高16位与低16位异或)拿到下标,判断数组第一个节点是否为空,为空直接插入,是链表直接插到末尾,过程中发现重复元素则覆盖,红黑树则执行旋转等操作,最后判断是否需要扩容,红黑树和链表是否需转换
- hashmap是否有线程安全问题?会有,1.7用头插法,多线程会出现死锁,1.8用尾插法解决,但仍不安全,可以用concurrenthashmap保证线程安全
- concurrenthashmap怎么保证线程安全?分段加锁,后续版本引入synchronized

- volitale修饰关键字的效果?保证变量的可见性,一次修改对其他线程可见
✅ 正确。标准说法:
- 保证 可见性(写线程修改立刻对其他线程可见)
- 禁止指令重排序(配合 happens-before 语义)
- ❗不保证原子性。
- volitale的原理?
不了解,可能用了反射机制
✳️ 正确描述:
- 使用 内存屏障(Memory Barrier) 实现,依赖 CPU 与 JVM 指令。
- 编译器在 volatile 写入后插入 Store Barrier,在读取前插入 Load Barrier。
- 创建线程的方式?继承thread类,实现runnable接口,实现callable接口,利用线程池创建,但底层都是thread的start方法
- 实现runnable接口,实现callable接口的区别?runnable传入的是task,callable可以拿到执行的返回值,多用于异步
- thread的start和run方法区别?start会调用start0方法向os请求线程创建资源,run就是在当前线程创建任务
- java中的锁用过哪些?synchronized和redis
- synchronizd和可重入锁的区别?
synchronized无法可重入,可重入锁内维护线程id和value,每次获取或释放锁修改value值- 二者 都支持重入。
- ReentrantLock 比 synchronized 更灵活(公平锁、超时、中断、tryLock)。
- synchronized 是 JVM 内置,基于对象头 Monitor。
- ReentrantLock 是 JUC 显式锁。
- 可重入锁是公平锁吗?忘了,是非公平锁吧

- 创建线程池的参数?七个,略
- 提交任务,但线程数满了怎么办?核心线程数满了后,
有新任务,此时创建新线程,如果达到最大线程数就把任务放到queue里,queue也满了就触发policy,默认是abortpolicy,返回线程池无法处理的异常,其他还有callerruns,discard,discardOldest等
标准答案(以最常用的“有界队列”配置为例):
提交流程(ThreadPoolExecutor + 有界队列)
- **先用核心线程(corePoolSize)**处理任务;
- 核心线程都忙了,任务进队列(workQueue);
- 队列满了,再创建非核心线程,直到最大线程数(maximumPoolSize);
- 还放不下,触发 拒绝策略(RejectedExecutionHandler)。默认 AbortPolicy 抛异常。其它还有:
- CallerRunsPolicy
- DiscardPolicy
- DiscardOldestPolicy
例外:像 newCachedThreadPool() 使用 SynchronousQueue(不存任务),会直接从核心 0 开始一路建线程到最大。
- mysql实现分页查询用哪个关键字?Limit 如limit
by(50,10)

- 你说的”50″是什么含义?是页码吗?
不是页码,是指字段,是表项
- mysql中的char和varchar区别?char定长,varchar不确定字长
- 那是不是说可以不用char全部用varchar?不是,
可能会和JDBC的设定冲突
标准答案:
- 不是。固定长度、高并发更新较少的字段(如状态码、固定长度哈希)可用 CHAR,减少碎片、提升性能。
- 大部分业务字段仍推荐 VARCHAR,节省空间
- mysql中聚簇索引和非聚簇索引是什么?叶子节点存储每行数据/只存储主键数据
- mysql什么情况下索引失效不走索引?违反最左匹配原则/模糊查询以“%”开头/
mysql语句用双引号不用单引号 - 什么是索引匹配原则?比如索引是(a,b,c),查询用(b,c)或者(C),这种就不满足匹配原则
标准答案:
- 组合索引 (a, b, c),必须从最左列 a 开始连续使用:
- 能用:a,(a,b),(a,b,c)
- 不能直接用:b、(b,c)、c
- 范围查询会截断:where a = ? and b > ? and c = ?,c 列无法走索引。
- 那如果是where(b =1 ,a =2)这种会走索引吗?会走,mysql在server层会优化语句,还是会走索引的
优化器会对等值条件重排,仍可命中 (a,b,c) 索引的前两列。
- 事务四大特性?ACID
- 隔离级别几种?读未提交、读已提交、可重复读、串行化
- 什么是幻读?事务A读某行表单读不到,后面由于其他事务操作又读到了
- 同一个事务里,两次按相同条件查询,第二次出现了“新增/删除的行”(行数变化),这叫幻读。
- 例:select * from order where price > 100,第二次多了新插入的行。
- 不可重复读是什么?某一事物前后两次读到的数据不一致
- 同一事务中,同一行数据两次读取内容不同(值被其他事务修改了)。
- 区别:不可重复读关注“同一行值变了”,幻读关注“满足条件的行数变了”。
- 既然你说不可重复读和幻读都是读到的数据不一致,那么他们两个的区别在哪?不知道
- 不可重复读:同一行内容被改,值不同。
- 幻读:满足条件的行的数量不同(新增/删除行)。
- InnoDB 的 RR 通过 MVCC(快照读)解决不可重复读,通过 Next-Key Lock(当前读 + 间隙锁)避免幻读。
- 事务隔离机制MVCC?隐藏字段+undolog+readview(决定当前事务可见哪些版本)
- readview是什么时候生成的?不知道
- RC(读已提交):每条语句执行时生成新的 ReadView。
- RR(可重复读):事务第一次执行快照读时生成,并且整个事务内复用该 ReadView(保证可重复读)。
- spring的注解有哪些?@controller,@component,@scope@order@configuration等等
- @RestController注解用过吗?封装了@Request注解,对前端请求封装的数据进行识别
- 如果定义的接口路径(sku/id=1)上有个变量,方法怎么用注解接收?
@Pathvariable接收,指定value为id
- 订单超时自动取消实现过吗,说说思路?redis缓存设定TTL,如果过期了查不到了就把订单状态改成取消
- 你的意思是数据库状态依赖用户主动查询,不查询就永远过期?可能得用到定时任务吧
- 了解过延迟队列吗,其实这个可以用延迟队列做?可能用mq实现吧,具体不了解





