ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

重生——第八次面试2026.8.10

2026/8/10 18:13:02 拓冰建站 浏览量
重生——第八次面试2026.8.10 上周四约面我还在朋友家吃烧烤不确定周五啥时候回家就约到了周一结果面试前我想看看具体信息岗位直接停招了感觉就只是走流程所以面的很快大概只有20min一、Java 八大基本数据类型完整列表基本类型占用字节取值范围默认值包装类byte1-128 ~ 1270Byteshort2-32768 ~ 327670Shortint4\(-2^{31}~2^{31}-1\)0Integerlong8\(-2^{63}~2^{63}-1\)0LLongfloat4单精度浮点0.0FFloatdouble8双精度浮点0.0DDoublechar2Unicode 0~65535\u0000Characterboolean无固定JVM 按需true/falsefalseBoolean补充要点基本类型存栈内存无对象头效率高包装类是对象存堆boolean没有明确字节规范编译后底层多用 int 标记不存在String基本类型String是引用类型。二、基本类型与包装类转换要点装箱、拆箱1. 基础概念自动装箱基本类型 → 包装类Integer a 10;等价Integer.valueOf(10)自动拆箱包装类 → 基本类型int b a;等价a.intValue()2. 核心注意事项空指针异常 NPE最高频坑包装类为null时直接拆箱一定会抛空指针Integer num null; int n num; // 运行时NullPointerException解决方案拆箱前判空。Integer 常量池缓存Integer.valueOf()默认缓存-128 ~ 127的对象区间内相等超出则新建对象地址不同Integer i1100, i2100; i1i2 → true Integer i3200, i4200; i3i4 → false开发中比较数值一律用equals()禁止包装类直接。类型精度丢失大范围包装类转小范围基本类型强制转换会溢出Long强转int数据丢失。运算时自动拆箱包装类做加减乘除、比较运算会自动拆箱频繁循环装箱拆箱产生大量临时对象GC 压力变大高频循环优先使用基本类型。Boolean、Character 缓存规则Boolean全局只缓存true/false两个实例Character缓存\u0000~\u007F。equals 重写规则包装类都重写了equals按数值比较永远比较对象地址。三、HashMap、Hashtable、ConcurrentHashMap 对比1.HashMap线程不安全多线程并发 put 会出现死循环、数据丢失JDK1.8 底层数组 链表 红黑树链表长度≥8 转红黑树≤6 退回链表初始容量 16负载因子 0.75key/value 允许nullkey 最多一个 null扩容容量翻倍重新 hash 移位优化不需要全部重算 hash不支持同步锁。2.Hashtable方法加synchronized重量级锁锁住整个数组并发效率极低key、value 都不允许null初始容量 11负载因子 0.75迭代器是fail-fast官方早已废弃新项目禁止使用。3.ConcurrentHashMap线程安全并发首选JDK1.7分段锁 Segment把数组分成多段每段独立加锁分段并发。JDK1.8主流放弃 Segment采用CAS synchronized锁住数组单个头节点锁粒度细化数据结构同 HashMap数组 链表 红黑树key/value 依旧不允许 null扩容支持并发协助扩容多线程一起迁移数据读操作基本无锁写操作加锁并发性能远优于 Hashtablesize()统计采用基数计数弱一致性不会强阻塞。选型总结单线程HashMap多线程并发ConcurrentHashMapHashtable彻底弃用四、HashSet 与 HashMap1. 底层关系HashSet内部完全基于 HashMap 实现private transient HashMapE,Object map; private static final Object PRESENT new Object();add(e)调用map.put(e, PRESENT)存入 HashMap 的 keyvalue 固定占位对象唯一性依托 HashMap 的 key 不可重复contains()、remove()全部复用 HashMap 方法。2. 核心区别存储结构HashMap键值对 key-value HashSet仅存储单个元素本质只使用 key。有序性两者都无序JDK1.8 不保证插入顺序 LinkedHashMap/LinkedHashSet 可保证插入顺序。null 支持HashMap 允许一个 key 为 nullHashSet 允许存入一个 null 元素。使用场景HashMap键值映射缓存、数据关联 HashSet去重、判断元素是否存在、集合唯一性校验。关键去重原理二者判断重复先hashCode()对比哈希值哈希相等再equals()两个方法必须同时重写才能正确去重。五、AQS 与常用锁体系1.AQSAbstractQueuedSynchronizer核心队列同步器JUC 锁的底层基础核心三要素state 同步状态变量int 类型0 无锁0 持有锁可做独占 / 共享标记FIFO 双向阻塞队列 CLH抢锁失败的线程入队自旋阻塞两种模式独占模式同一时刻只允许一个线程获取ReentrantLock共享模式多线程同时获取CountDownLatch、Semaphore、ReadWriteLock 读锁。2.AQS 核心流程线程抢锁失败 → 封装为 Node 节点入队 → 自旋尝试获取锁 → 获取失败 LockSupport.park 阻塞 持有锁线程释放 state → 唤醒队首节点继续竞争。3. 基于 AQS 的常见锁ReentrantLock 可重入独占锁可重入同一线程多次加锁state 累加解锁次数必须匹配支持公平锁 / 非公平锁公平按队列顺序抢锁非公平插队竞争可中断、可限时尝试获取锁比synchronized灵活。synchronized内置监视器锁底层不是 AQS依托对象 MarkWord偏向锁→轻量级自旋锁→重量级 OS 互斥锁。ReentrantReadWriteLock 读写锁AQS 高 16 位存读锁计数低 16 位存写锁读读共享、读写互斥、写写互斥适合读多写少场景。StampedLock乐观读模式无锁数据冲突再升级悲观读并发性能优于读写锁。CountDownLatch 闭锁AQS 共享模式state 初始计数线程 await 等待计数器归 0 后全部唤醒。Semaphore 信号量控制并发线程数量state 代表许可数acquire 拿许可release 归还。CyclicBarrier 循环栅栏一组线程互相等待全部到达屏障点再一起执行可重复使用。补充锁优化方向偏向锁消除、自旋自适应、锁粗化、分段锁、读写分离锁。六、线程池详解1. 四种常用内置线程池Executors.newFixedThreadPool(n)固定核心线程数无空闲回收无界阻塞队列LinkedBlockingQueue 适用任务量平稳、CPU 密集型固定并发。 隐患无界队列堆积大量任务 OOM。Executors.newCachedThreadPool()核心线程数 0最大线程 Integer.MAX_VALUE空闲线程 60s 自动回收同步队列 SynchronousQueue 不存储任务 适用短时大量突发任务IO 密集型 隐患无限创建线程高并发下线程打爆操作系统。newSingleThreadExecutor单一线程串行执行任务newScheduledThreadPool定时延迟执行任务。2.ThreadPoolExecutor 七大核心参数public ThreadPoolExecutor( int corePoolSize, //1.核心线程数 int maximumPoolSize, //2.最大总线程数 long keepAliveTime, //3.非核心线程空闲存活时间 TimeUnit unit, //4.时间单位 BlockingQueueRunnable workQueue, //5.阻塞等待队列 ThreadFactory threadFactory, //6.线程工厂自定义线程名、优先级 RejectedExecutionHandler handler //7.拒绝策略 )执行流程任务进来核心线程未满 → 创建核心线程执行核心线程已满 → 放入阻塞队列排队队列塞满 → 创建非核心线程总线程不超过 maximumPoolSize总线程打满队列满 → 触发拒绝策略。四种拒绝策略AbortPolicy默认直接抛 RejectedExecutionExceptionDiscardPolicy默默丢弃当前任务DiscardOldestPolicy丢弃队列队首等待最久任务重试提交CallerRunsPolicy交给提交任务的主线程执行。开发规范禁止直接使用 Executors 创建线程池手动实例化 ThreadPoolExecutor自定义参数 有界队列防止 OOM。七、MySQL 分页优化、千万级数据治理1. 延迟关联优化深分页limit offset 过大问题limit 1000000,10MySQL 需要扫描并丢弃前 100 万行性能极差。方案延迟关联先通过主键索引定位分页起始主键再回表查询详情-- 低效写法 select * from table limit 1000000,10; -- 优化延迟关联 select t.* from table t inner join (select id from table order by id limit 1000000,10) tmp on t.idtmp.id;原理子查询仅走主键索引无回表扫描速度极快只对精准 id 回表拿全字段。 其他优化主键分页游标分页where idlast_max_id limit 10适合 APP 下拉分页杜绝大 offset。2. 日志初期用 MySQL数据千万 / 上亿级解决方案为什么初期可以用 MySQL 存日志开发便捷、成本低、上手快小体量数据简单查询统计足够使用。数据量上亿后的痛点单表膨胀、索引臃肿、写入阻塞、查询缓慢、归档困难。整套优化方案分库分表水平分表按时间天 / 月分表日志天然按时间分区冷热数据分离Sharding-JDBC 做分片路由。分区表 PartitionMySQL 按时间 RANGE 分区查询自动裁剪分区只扫描对应时间分区数据。架构替换最优日志采集Filebeat → Kafka 消息队列削峰 → Elasticsearch 存储检索 ES 擅长海量日志全文检索、聚合、日志排查MySQL 只留存少量核心统计汇总数据。冷热数据分离近期热数据 ES 在线查询数月前冷数据归档至 HDFS/OSS 对象存储离线分析写入优化批量插入、关闭事务自动提交、避免单条频繁 insert适当调大 innodb 刷盘参数。定期清理归档定时脚本删除过期无用日志避免表无限膨胀。八、Redis 实战、Redisson 分布式锁、常用结构 Set1.Redis 常规业务使用场景热点数据缓存减轻 MySQL 压力商品、配置、首页数据分布式会话、登录 token限流计数器、滑动窗口排行榜、计数、分布式自增 ID消息队列List、Stream全局分布式锁。2.Redisson 分布式锁主流成熟方案原生 Redis SETNX 存在问题死锁、锁续期麻烦、主从切换锁丢失、代码冗余。Redisson 优势自动看门狗续期加锁成功后台定时线程续命业务没执行完不会过期死锁支持可重入锁、公平锁、读写锁、联锁基于 Lua 脚本保证加锁、解锁原子性主从切换、集群模式下锁可靠性更高自带超时等待避免无限阻塞。基础使用RLock lock redissonClient.getLock(order_lock); try{ boolean acquire lock.tryLock(10,30,TimeUnit.SECONDS); if(acquire){ 执行业务 } }finally{ if(lock.isHeldByCurrentThread()) lock.unlock(); }3.Set 数据结构应用元素天然去重用户标签、黑名单、手机号去重集合运算交集 sinter共同好友、差集 sdiff独有好友、并集 sunionSPOP随机抽奖、随机抽取元素SISMEMBER高效判断元素是否存在替代 MySQL 频繁 exists 查询ZSet 有序集合拓展排行榜、延时队列。Redis 三大缓存问题穿透、击穿、雪崩布隆过滤器防穿透互斥锁 / 永不过期热点 key 防击穿过期时间打散、集群高可用防雪崩。九、Spring 事务 Transactional 九大失效高频场景1. 方法访问权限非 publicTransactional基于 AQS 动态代理private/protected/default 方法无法被代理拦截事务不生效。2. 同类内部方法自调用A 代理调用本类无注解 B 方法B 上事务注解失效 原因自调用不走代理对象原生对象执行不会触发事务增强。 解决拿到代理对象调用、拆分到不同类、SpringContext 获取自身代理。3. 异常类型捕获错误默认只回滚RuntimeException、Errortry-catch 捕获异常后没有重新抛出事务感知不到异常不会回滚Transactional public void test(){ try{ int a1/0; }catch(Exception e){ // 吃掉异常事务不会回滚 } }解决catch 后手动throw new RuntimeException()或注解指定rollbackFor Exception.class。4. 传播行为配置错误例如REQUIRES_NEW新开事务、SUPPORTS非事务环境下无事务NOT_SUPPORTED强制挂起事务在非事务中执行。5. 数据库引擎不支持事务MyISAM 不支持事务必须使用 InnoDB 引擎。6. 多线程异步执行事务主线程开启子线程执行数据库操作子线程独立事务上下文主线程事务无法管控子线程。7. 手动修改事务传播状态手动开启 / 关闭事务、编程式事务混用注解事务导致上下文混乱。8. 实体类未被 Spring 管理手动 new 对象调用带注解方法没有经过 Spring 代理事务失效。9. 嵌套事务、保存点使用不当REQUIRED 嵌套共用外层事务内层异常会导致整体回滚若配置异常捕获逻辑不当看起来事务失效。补充事务隔离级别READ_UNCOMMITTED、READ_COMMITTEDMySQL 默认、REPEATABLE_READ、SERIALIZABLE。