大厂开发高频面试题

5 阅读1分钟

一、说一下==与equals()的区别?(华为后端)

一句话总结:

==比较的是对象内存地址是否相同,适用于基本数据类型和对象引用比较。

equals()用于对象内容比较,默认实现等同于==,但常被重写(如String类)。

String等包装类重写equals()后比较实际值而非地址。

基本类型只能用==比较数值,对象类型需根据需求选择比较方式。

正确使用时应确保equals()方法被目标类正确实现。

核心原则:

1)基本类型(int,char等)用==比较值。

2)引用类型:

    1.若需要判断是否为同一对象->==。

    2.若需要判断内容是否相等->重写equals(),并确保同步重写hashCode()。

3)包装类和字符串优先使用equals()比较内容。

二、如何创建线程池?线程池常见参数有哪些?(华为后端、美团后端、字节跳动后端、小红书后端、京东后端、华为开发岗、阿里巴巴后端、滴滴后端、快手后端、小米后端、百度后端)

一句话总结:

创建线程池可通过Java的ThreadPoolExecutor构造函数或Executors工具类实现。核心参数包括:核心线程数(维持常驻线程),最大线程数(扩容上限)、存活时间(非核心线程空闲时长)、任务队列(存放待执行任务)、拒绝策略(队列满时的处理方式)。

三、ThreadLocal 的用法和实现原理?(华为后端、小红书后端

一句话总结:

ThreadLocal用于存储线程私有数据,通过set()/get()在当前线程内共享变量,每个ThreadLocal内部维护ThreadLocalMap,以ThreadLocal实例为键存储独立副本,数据隔离通过线程专属的Map实现,避免多线程竞争。需注意使用后及时remove()防止内存泄露,弱引用键设计可辅助垃圾回收。

四、说说你了解的JVM内存模型?(华为后端、美团后端、小红书后端、京东后端、华为开发岗、阿里巴巴后端、快手后端、小米后端

一句话总结:

JVM内存模型主要包含堆(存放对象实例)、方法区(存储类信息、常量)、虚拟机栈(线程私有方法调用)、本地方法栈(Native方法)和程序计数器(线程执行位置)。堆和方法区线程共享。栈和程序计数器线程私有,直接内存通过堆外分配管理。

补充:JVM结构

JVM由三部分组成:类加载子系统、执行引擎、运行时数据区。

1)类加载子系统:可以根据指定的全限定名来载入类或接口。

2)执行引擎:负责执行那些包含在被载入类的方法中的指令。

3)运行时数据区:分为方法区、堆、虚拟机栈、本地方法栈、程序计数器。

当程序运行时,JVM需要内存来存储诸多内容,例如:字节码、对象、参数、返回值、局部变量、运算的中间结果等,把这些东西存储到运行时数据区中,以便于管理。

五、说说JVM的垃圾回收算法?(华为后端、美团后端、字节跳动后端、小红书后端、京东后端、腾讯后端、滴滴后端、快手后端、小米后端、百度后端

一句话总结:

JVM垃圾回收算法主要包括:标记-清除(产生内存碎片)、复制算法(适合新生代)、标记-整理(适合老年代)。现代JVM多采用分代收集策略,结合不同算法管理新生代(复制)和老年代(标记-清除/整理)。还有增量、并发算法(如G1)减少停顿时间。

六、说说你对IoC的理解?(华为后端)

一句话总结:

IoC(控制反转)是一种设计原则,将对象创建和依赖管理的控制权从程序转移到外部容器,降低代码耦合。核心思想是“依赖由外部注入而非主动创建”,常见方式为依赖注入(DI)。通过容器统一管理对象生命周期,提升代码灵活性和可维护性,使组件更易测试和扩展。

七、说说你对AOP的理解?(华为后端、小红书后端、京东后端、华为开发岗

一句话总结:

AOP(面向切面编程)通过横向抽取共性功能(如日志、事务),解决代码重复和耦合问题。以动态代理机制在目标方法前后织入增强逻辑,核心概念包括切点(where)、通知(what)、切面(where+what)。实现了业务逻辑与横切关注点分离,提升代码复用性和可维护性。

八、JDK动态代理是什么?和cglib区别?(华为后端、小米后端)

一句话总结:

JDK动态代理是Java基于接口实现的代理技术,通过反射机制在运行时生成代理类。

与CGLib的区别:

1)JDK需实现接口,CGLib通过继承直接代理普通类;

2)JDK无需第三方库,CGLib需引入ASM包;

3)CGLib无法代理final类/方法,JDK无法代理无接口类;

4)CGLib生成代理类性能通常更高。

九、如何评估 / 判断索引是否生效?常见索引失效场景有哪些?(华为后端、字节跳动后端、京东后端、滴滴后端、小米后端

一句话总结:

评估索引是否失效需要”三看“:看执行计划是否命中索引(EXPLAIN)、看扫描行数是否骤降(rows)、看查询耗时是否锐减(性能监控);失效常因”破坏索引结构“或”优化器弃用“(如函数计算、隐式转换、前导通配符等)。

十、什么是主从同步?MySQL 如何实现?(华为后端)

一句话总结:

主从同步是指在数据库中将主库的数据复制到从库,以实现数据冗余和负载均衡,MySQL通过二进制日志(binlog)和复制线程实现这一过程。

十一、请你说说HashMap底层原理和扩容机制?(美团后端、字节跳动后端、小红书后端、京东后端、华为开发岗、腾讯后端、阿里巴巴后端、快手后端、小米后端、百度后端

一句话总结:

HashMap底层采用数组+链表/红黑树结构,通过哈希算法确定元素存储位置。默认初始容量16,负载因子0.75,当元素数量超过(容量x负载因子)时触发扩容。扩容时创建双倍容量新数组,通过高位运算重新计算节点位置(JDK8优化为无需重新hash),原数据通过尾插法迁移到新数组,链表长度超过8且数组长度≥64时会转为红黑树,提升查询效率。

十二、详细的说说Redis的数据类型?(美团后端、字节跳动后端、京东后端、华为开发岗、腾讯后端、阿里巴巴后端、滴滴后端、快手后端、百度后端

一句话总结:

Redis核心数据类型包括:

1)String:存储文本、数字或二进制数据。

2)List:双向链表,支持队列和栈操作。

3)Hash:字段-值映射,适合存储对象。

4)Set:无序唯一集合,支持交并差运算。

5)Sorted Set:按分数排序的有序集合。扩展类型含Bitmaps、HyperLogLog、地理空间及Stream(消息队列)。

十三、说说Redis的持久化策略?(美团后端、字节跳动后端、腾讯后端、阿里巴巴后端、滴滴后端、百度后端

一句话总结:

Redis提供两种持久化策略:RDB(快照)和AOF(追加日志)。RDB通过定时生成数据快照实现,适合快速恢复但可能丢失部分数据;AOF记录所有写操作命令,数据完整性更高但文件较大。此外,Redis支持混合持久化模式(AOF+RDB),结合两者优势实现高效备份与恢复。

十四、Redis如何与数据库保持双写一致性?(美团后端、字节跳动后端、京东后端、腾讯后端、快手后端、百度后端

一句话总结:

为确保Redis与数据库双写一致性,常用方法包括:先更新数据库再删缓存(Cache-Aside)、延迟双删(更新前后均删除缓存并延迟二次删除)、基于消息队列异步同步、监听数据库binlog触发缓存更新,以及设置缓存过期时间兜底,需结合业务场景选择策略,配合重试机制确保最终一致性。

十五、从「敲下一个 URL」到「页面出现在屏幕」整条链路全景?(美团后端、字节跳动后端、小红书后端、腾讯后端、阿里巴巴后端、滴滴后端、快手后端、小米后端、百度后端

一句话总结:

“敲下URL->解析地址->DNS找人->(TCP/QUIC+TLS)打通线路->发HTTP请求->服务器回资源->浏览器边下边渲染->四次挥手收尾”。

十六、HTTP vs. HTTPS 有什么区别?(美团后端、字节跳动后端、腾讯后端、滴滴后端、快手后端、百度后端

一句话总结:

HTTP想明信片——谁都能偷看;HTTPS像贴好身份证、加密又防篡改的快递箱,既保证内容机密,也验证“寄件人”身份。

十七、HTTPS 的「秘钥交换 + 证书校验」全流程?(字节跳动后端、腾讯后端)

一句话总结:

HTTPS通过「证书像身份证、密钥交换像一次临时暗号本的当面约定」的握手流程,实现了“我是谁+对话只让你看”双重保障。

十八、TCP 与 UDP 的 10 大核心区别是什么?(美团后端、字节跳动后端、小红书后端、腾讯后端、滴滴后端、快手后端、小米后端、百度后端

1)连接方式:

TCP:面向连接,需通过三次握手建立连接,传输结束后通过四次挥手释放连接。

UDP:无连接,直接发送数据,无需预先建立连接。

2)可靠性:

TCP:可靠传输,通过确认应答(ACK)、超时重传、丢包重发等机制保证数据完整有序。

UDP:不可靠传输,不保证数据是否到达或顺序正确。

3)数据顺序:

TCP:通过序列号和确认机制保证数据按发送顺序到达。

UDP:不保证顺序,即使数据乱序到达也不会重新排序。

4)流量控制:

TCP:通过滑动窗口机制动态调整发送速率,避免接收方缓冲区溢出。

UDP:无流量控制,可能因发送过快导致丢包。

5)拥塞控制:

TCP:通过慢启动、拥塞避免等算法(如Reno、CUBIC)避免网络拥堵。

UDP:无拥塞控制,可能加剧网络拥堵。

6)传输效率:

TCP:因连接管理、重传等机制,头部开销大(20字节以上),传输效率较低。

UDP:头部仅8字节,无额外控制机制,传输效率高。

7)数据边界:

TCP:基于字节流,无明确消息边界,需应用层自行处理(如添加分隔符)。

UDP:保留数据报边界,每次发送/接收均为独立报文。

8)多播/广播支持

TCP:仅支持单播(一对一通信)。

UDP:支持单播、多播(一对多)和广播(一对所有)。

9)适用场景:

TCP:要求可靠传输的场景(如网页浏览、文件传输、电子邮件)。

UDP:实时性优先的场景(如视频流、语音通话、在线游戏、DNS查询)。

10)首部大小:

TCP:首部至少20字节(包含选项字段可更长)。

UDP:固定8字节首部(源端口、目的端口、长度、校验和)。

十九、说说 TCP 的三次握手?(美团后端、字节跳动后端、华为开发岗、腾讯后端、滴滴后端、快手后端、小米后端、百度后端

一句话总结:

三次握手=“我能发->你能收->我知道你能收”,两次握手保证不了双方都确认通路可用,而四次又可把“确认+发起”合并成一次包,因此恰好三次最经济;若任意报文丢失或主机发完SYN就宕机,TCP都靠超时重传+半开连接清理机制自动收场。

二十、TCP 协议如何保证可靠传输?(字节跳动后端、小红书后端、腾讯后端

一句话总结:

TCP通过给每个字节编号、累积确认与超时重传、滑动窗口流量控制、校验和检测以及拥塞控制等协同机制,实现端到端的可靠传输。

二十一、Redis中的Zset怎么实现的?(字节跳动后端、小米后端)

一句话总结:Redis的Zset通过跳跃表现和哈希表实现,哈希表存储成员到分数的映射以支持快速查询,跳跃表按分数排序成员以支持高效的范围操作。两者结合确保插入、删除和查询的时间复杂度为O(log n)。数据量小时可能使用压缩列表优化内存。

二十二、消息队列如何保证消息不丢?(字节跳动后端、阿里巴巴后端、滴滴后端)

一句话总结:

消息队列通过多环节保障机制防止消息丢失:生产者使用确认机制(如ACK)确保消息成功发送至Broker;Broker采用持久化存储(如磁盘写入)和副本同步防止数据丢失;消费者处理成功后手动提交确认,失败时触发重试;消息重试机制和死信队列处理异常情况;整体通过事务机制或者幂等设计保证端到端一致性。

二十三、什么是进程和线程?进程和线程的区别?(美团后端、字节跳动后端、小红书后端、京东后端、华为开发岗、腾讯后端、阿里巴巴后端、滴滴后端、快手后端、小米后端、百度后端

一句话总结:

进程是操作系统中资源分配的基本单位,线程是进程中执行的基本单位,进程拥有独立的内存空间,而线程共享进程的内存空间和资源。

进程是操作系统分配资源的最小单位,线程是CPU调度的最小执行单元。关键区别有两点:

1)线程共享进程资源(通信高效),进程资源独立;

2)线程创建/切换开销远小于进程;

二十四、进程间通信方式有哪些?(字节跳动后端、腾讯后端、快手后端、百度后端)

一句话总结:

进程间通信(IPC)方式包括管道、消息队列、共享内存、信号量、套接字和信号等,每种方式在不同场景下具有独特的优势和适用性。

二十五、为什么 MySQL 采用 B+ 树作为索引?(美团后端、字节跳动后端、小红书后端、京东后端、腾讯后端、快手后端、百度后端

一句话总结:

MySQL采用B+树作为索引,因为它支持高效的范围查询、顺序访问和磁盘读写优化。B+树的叶子节点链表结构支持顺序访问和范围查询,树的高度较低,减少了磁盘I/O次数,适合处理大规模数据集,且能够有效支持等值查询和范围查询。

二十六、如何监控并优化慢 SQL?(美团后端、字节跳动后端、京东后端、腾讯后端、滴滴后端、快手后端、百度后端

一句话总结:

监控并优化慢SQL可以通过启用慢查询日志、分析查询计划、优化索引和调整查询结构等方法实现。

二十七、事务隔离级别有哪些?(美团后端、字节跳动后端、京东后端、华为开发岗、腾讯后端

一句话总结:

MySQL提供四种事务隔离级别:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read,MySQL默认)和串行化(Serializable),它们从低到高一次增强数据一致性,但并发性能递减。

二十八、请你说说ArrayList和LinkedList的区别?(美团后端、小红书后端、华为开发岗、腾讯后端、小米后端

一句话总结:

ArrayList基于动态数组实现,随机访问快(O(1)),但增删元素需移动数据(O(n));LinkedList基于双向链表实现,增删元素快(O(1)),但随机访问需遍历(O(n))。ArrayList内存连续但可能预留空间,LinkedList每个节点含前后指针更占内存。线程均不安全,适用场景取决于读写操作比例。

二十九、说说缓存穿透、击穿、雪崩的区别?(美团后端、小红书后端、京东后端

一句话总结:

缓存穿透是查询不存在的数据绕过缓存击穿数据库;缓存击穿是热点数据过期导致瞬间高并发请求压垮数据库;缓存雪崩是大量缓存同时失效引发数据库连锁崩溃。区别在于穿透因数据不存在,击穿因单点热点失效,雪崩因大规模缓存失效。

三十、讲一下乐观锁和悲观锁?(美团后端、阿里巴巴后端)

一句话总结:

乐观锁假设操作冲突少,只在提交时检查数据是否被修改(如版本号机制),适用于读多写少场景。悲观锁预先加锁(如行锁,表锁),确保独占操作,适合写多场景,但影响并发性能,前者减少锁竞争,后者保证强一致性。

三十一、HTTP 常见状态码有哪些?(美团后端、百度后端)

HTTP状态码分为五大类,核心按请求结果划分:

2xx成功、3xx重定向、4xx客户端错误、5xx服务端错误,1xx很少用。

高频的比如200(请求成功带数据)、204(成功无数据);

301永久重定向(域名迁移)、302临时重定向(未登录跳登录)、304用缓存;

400参数错误、401未登录、403无权限、404资源不存在;

500服务端bug、502网关收无效相应(如后端崩了)、504网关超时(后端处理慢)。

开发中查问题先看状态码:4xx查客户端,5xx查服务端。

三十二、联合索引的存储结构与最左前缀原则?(美团后端、小红书后端

一句话总结:

联合索引的存储结构是将多个列的值组合在一起形成一个复合键,按照字典序进行排序存储。

最左前缀原则指的是在使用联合索引时,查询条件必须从索引的最左列开始,才能有效利用索引进行加速查询。

只有满足最左前缀的查询条件,才能充分发挥联合索引的性能优势。

三十三、说说synchronize的用法及原理?(小红书后端、快手后端、小米后端)

一句话总结:

synchronized用于控制多线程对共享资源的访问,可修饰方法或代码块,通过指定锁对象实现互斥,通过指定锁对象实现互斥。其原理基于对象内部的监控器锁(Monitor),线程进入时获取锁,退出时释放锁,底层依赖操作系统的互斥锁及内存屏障机制保证原子性与可见性,JVM会优化锁状态(偏向锁,轻量级锁等)提升性能。

三十四、说说类加载机制?(小红书后端、快手后端)

一句话总结:

类加载机制是JVM动态加载类的过程,包含加载、验证、准备、解析和初始化五个阶段。加载阶段读取.class文件生成Class对象;验证确保字节码合法;准备为静态变量分配内存并赋默认值;解析将符号引用转为直接引用;初始化执行静态代码块和变量赋值。各阶段顺序执行,确保类正确加载且符合安全规范。

三十五、说说Bean的生命周期?(小红书后端)

一句话总结:

Bean的生命周期分为:实例化(构造函数)->属性注入(依赖注入)->初始化(执行Aware接口、BeanPostProcessor前置处理、@PostConstruct、InitializingBean、自定义init方法)->使用阶段->销毁(@PreDestory、DisposableBean接口或自定义destroy方法)。容器通过回调机制在各阶段执行特定扩展点。

三十六、介绍一下Redis的集群模式?(小红书后端)

一句话总结:

Redis集群模式(Cluster Mode)是一种分布式解决方案,通过分片(16384个哈希槽)将数据分散到多个节点,支持自动数据迁移和故障转移。每个节点可为主从结构,主节点处理读写,从节点备份并在主节点故障时接替,实现高可用。客户端通过重定向机制访问数据,无需代理,支持横向扩展与容错。

三十七、讲一下限流算法?(小红书后端、滴滴后端)

一句话总结:

限流算法用于控制系统的请求处理速率,常见方法包括:1.计数器算法(固定时间窗口限制请求数,存在临界突变问题);2.滑动窗口算法(细化时间粒度,平滑流量控制);3.漏桶算法(以恒定速率处理请求,缓冲突发流量);4.令牌桶算法(定期生成令牌,允许短时突发通过);5.自适应算法(根据系统负载动态调整阈值,如TCP拥塞控制)。

三十八、redo log / undo log / binlog 各自作用?(小红书后端、京东后端

一句话总结:

redo log用于数据恢复,undo log用于事务回滚,binlog用于数据复制和恢复,三者在MySQL中各司其职,确保数据一致性和持久性。

三十九、synchronized和Lock有什么区别?(京东后端)

一句话总结:

1.机制:synchronized是Java关键字,基于JVM实现自动锁管理;Lock是接口,需手动加锁解锁。

2.灵活性:Lock支持非阻塞尝试锁(tryLock)、可中断锁、超时锁,synchronized无法实现。

3.公平性:Lock可设置公平、非公平策略,synchronized仅支持非公平锁。

4.条件变量:Lock可通过Condition绑定多个条件,synchronized仅一个等待队列。

5.性能:高并发时Lock更高效,synchronized优化后差距缩小,但Lock需显式释放避免死锁。

四十、说说你对AQS的理解?(京东后端)

一句话总结:

AQS(AbstractQueuedSynchronized)是Java并发包的核心同步框架,通过内置的FIFO队列管理线程竞争,使用volatile变量state表示同步状态。它提供独占和共享两种模式,子类只需重写tryAcquire/tryRelease等模板方法即可实现锁、信号等同步器(如ReentrantLock/Semaphore),解决了同步控制中线程排队与唤醒的底层细节问题。

四十一、说说Spring事务管理?(京东后端)

一句话总结:

Spring事务管理提供声明式与编程式两种方式,通过@Transactional注解或XML配置简化事务控制,支持事务传播行为、隔离级别及回滚规则。底层基于事务管理器(如DataSourceTransactionManager)统一接口,兼容不同持久层技术,确保数据一致性和原子性。

四十二、说说Redis的缓存淘汰策略?(京东后端)

一句话总结:

Redis提供多种缓存淘汰策略,包括:volatile-lru(针对过期键的LRU淘汰)、allkeys-lru(全体键LRU)、volatile-lfu(过期键LFU)、allkeys-lfu(全体键LFU)、volatile-ttl(优先淘汰剩余时间短的键)、volatile-random/allkeys-random(随机淘汰),以及默认的noeviction(禁止写入)。策略根据内存上限自动触发,用于管理内存不足时的数据清理。 

四十三、SQL 调优常见方法有哪些?(京东后端、华为开发岗、阿里巴巴后端、滴滴后端、百度后端)

一句话总结:

SQL调优常见方法包括索引优化、查询重构、使用缓存、减少锁定和优化数据库配置等。

四十四、MySQL 中的 MVCC 是什么?Read View 在 MVCC 中如何工作?如果没有 MVCC 会怎样?(京东后端、滴滴后端、小米后端)

一句话总结:

MySQL的MVCC(多版本并发控制)是通过数据版本链和Read View机制实现非阻塞读的高并发方案;Read View是MVCC的核心组件,决定事务能看到哪些数据版本;没有MVCC将导致读写冲突加剧、性能骤降、死锁频发。

四十五、String、StringBuffer、Stringbuilder有什么区别?(华为开发岗)

一句话总结:

String不可变,每次修改生成新对象;StringBuffer和StringBuilder可变。StringBuffer线程安全但性能较低,StringBuilder非线程安全但效率更高。单线程用StringBuilder,多线程用StringBuffer,少量操作用String。

四十六、说说线程的创建方式?(华为开发岗)

一句话总结:

1.继承Thread类并重写run方法。

2.实现Runnable接口并实现run方法。

3.使用Cailable接口配合FutureTask实现带返回值的线程。

4.通过线程池(如Executor框架)创建管理线程。

5.使用Lambda表达式或匿名内部类简化线程实现。

四十七、说一下Java中的深拷贝、浅拷贝、引用拷贝?(华为开发岗)

一句话总结:

引用拷贝:复制对象引用地址,新旧变量指向同一对象。

浅拷贝:创建新对象,复制基本类型值,引用类型仍指向原对象。

深拷贝:完全复制对象及关联的所有子对象,新旧对象完全独立。

实现方式:浅拷贝常用clone()方法(需重写),深拷贝需递归复制或序列化实现。

核心区别:深拷贝隔离数据修改,浅拷贝和引用拷贝存在数据关联性。

四十八、指针和引用的区别是什么?(华为开发岗)

一句话总结:

指针是一个存储地址的变量,可以指向不同对象,也可以为空(nullptr)。

引用是某个对象的别名,定义时必须初始化且之后不可修改,始终指向同一个对象。

四十九、HTTP/1.0、HTTP/1.1、HTTP/2.0、HTTP/3.0 的区别?(腾讯后端、滴滴后端)

1.HTTP/1.0与HTTP/2.0的区别

一句话总结:

HTTP/1.0是”单车道、纯文字“的老国道;HTTP/2.0则是”多车道、全双工、二进制“的高速公路。

2.HTTP/2.0与HTTP/3.0的区别

一句话总结:

HTTP/2.0是”跑在TCP上的多股车道高速“;HTTP/3.0把底层换成QUIC(UDP),”修了一条能换轮胎、永不堵车的新高铁“。

3.HTTP/1.1与HTTP/2.0的区别

一句话总结:

HTTP/1.1是”一根水管+排队取水“;HTTP/2.0把水管加粗成”多股细流并发+加压泵+伺服阀“。

总结口诀:

1.1->2.0:文本变二进制、串行变并行、重复首部变压缩、客户端请求变”可被推送“。

2.0->3.0:TCP变QUIC、握手更快、丢包隔离、连接可迁移。

0->1->2->3就像”修国道->加车道->上高速->换高铁“。

五十、如何在 UDP 之上实现可靠传输?(腾讯后端、阿里巴巴后端)

一句话总结:

在UDP之上实现可靠传输,需要自行引入分段与序号、校验和、确认与重传、超时重传、流量/拥塞控制等机制,模拟TCP的可靠特性。

五十一、说说volatile的用法及原理?(阿里巴巴后端)

1、volatile是一个Java的关键字,用来解决内存可见性问题的。

2、当多个线程操作共享变量时,会存在数据不一致的问题。因为在Java内存模型中,有工作内存和主内存,每个线程都有自己的工作内存,里边存储变量的副本,当对一个普通变量进行写操作时,不会立即同步到主内存,因此其他线程不能立即看到最新的值,这就是内存可见性问题。

3、通过volatile关键字修饰的变量可以解决这个问题,JVM底层是通过内存屏障来实现,当对一个变量进行读取时,插入读屏障,表示先从主内存读取,当对一个变量进行写入后,插入写屏障表示立即同步到主内存,这样就解决了可见性问题,保证了数据一致性,对应于硬件层面,看到资料说是Intel提供了缓存一致性协议MESI,对共享变量写入时,发出通知让其他CPU核心缓存行失败,早期的CPU是通过对总线加锁的方式实现。

4、但volatile不能解决原子性问题,因为每个线程都有工作内存,各自线程计算完后同步到主内存会存在覆盖的问题。

5、volatile的使用场景一般应用在于一个线程读,另一个线程写的情况下,例如标志位这类,同时读写一个volatile的场景不适合,因为会出现原子性问题。

五十二、讲一下Java里的CAS?(阿里巴巴后端、快手后端)

一句话总结:

CAS(Compare-And-Swap)是Java中基于硬件的无锁并发机制,通过比较内存值与预期值进行原子更新。核心方法包含内存地址、预期值和新值,若匹配则更新,否则重试或放弃。常用于AtomicInteger等原子类实现线程安全操作,避免加锁开销。存在ABA问题(可通过版本号标记解决),适用于低竞争场景。

五十三、介绍下双亲委派模型,如何打破它?(阿里巴巴后端、小米后端)

一句话总结:

双亲委派模型是Java类加载机制,子类加载器先委托父类加载器尝试加载类,避免重复加载并保证核心类安全,打破方式包括:1.重写ClassLoader的loadClass()方法,自定义加载逻辑;2.使用线程上下文类加载器,强制指定类加载器层级;3.SPI等场景通过反向委托(如JDBC驱动加载)绕过默认机制。

五十四、消息队列如何保证顺序消费?(阿里巴巴后端)

一句话总结:

消息队列通过生产者按顺序发送至同一分区/队列,消费者单线程顺序处理实现。需确保同一业务标识的消息路由到相同分区,并限制分区仅被一个消费者消费。部分中间件支持全局顺序或局部顺序控制。同时需处理异常重试机制防止乱序。

五十五、消息队列如何保证不重复消费?(阿里巴巴后端、滴滴后端)

一句话总结:

消息队列通过以下机制避免重复消费:1.生产者端添加唯一消息ID实现发送幂等性;2。消息队列服务端支持Exactly-Once语义(如Kafka事务消息);3.消费者端采用去重机制(如数据库唯一索引、Redis原子操作记录已消费ID);4.业务逻辑设计幂等处理(如状态检查、乐观锁);5.正确维护消费位移、确保异常后能从正确位置恢复。

五十六、建索引时需注意哪些事项?(阿里巴巴后端、快手后端、小米后端)

一句话总结:

建索引时需注意以下事项:首先,选择合适的列进行索引,优先考虑经常用于查询条件、排序和连续的列;其次,避免在频繁更新的列上建立索引,以减少维护开销;此外,控制索引的数量,过多的索引会影响写入性能;同时,注意索引的选择性,选择性高的索引能更有效地过滤数据;最后,定期分析和优化索引,以适应数据和查询模式的变化。

五十七、大表(千万级)查询 / 维护该怎么办?(阿里巴巴后端)

一句话总结:

处理千万级大表的查询和维护需要通过索引优化、分区、分表、批量操作和数据库配置调整等方法来提高性能和可维护性。

五十八、深度分页、读写分离、分库分表后 SQL 该如何优化?(阿里巴巴后端)

一句话总结:

在深度分页、读写分离和分库分表的场景下,SQL优化可通过使用索引、限制数据扫描、合理设计查询和缓存策略来提高性能。

五十九、如何利用Redis实现一个分布式锁?(滴滴后端)

一句话总结:

使用Redis的SET命令配合NX(不存在时设置)、EX(过期时间)参数创建唯一键作为锁,并生成随机值标识客户端。获取锁失败时重试或退出,业务处理完成后校验随机值并用Lua脚本原子化删除键释放锁。需注意设置合理超时时间防止死锁,高可用场景可采用RedLock算法增强可靠性。

六十、分布式锁的原理和常见的实现有哪些?(滴滴后端)

一句话总结:

分布式锁通过在共享存储系统中维护互斥状态,确保多个节点间资源访问的排他性。常见实现包括:1.基于数据库(如唯一约束、乐观锁);2.Redis(SETNX命令或RedLock算法);3.ZooKeeper(临时有序节点+Watcher监听);4.Etcd(基于Raft协议的事务与租约机制)。不同方案在性能、一致性和复杂度上各有取舍。 

六十一、讲一下防抖节流以及适用场景?(滴滴后端)

一句话总结:

防抖:事件触发后延迟执行,若重复触发则重置延迟。适用场景:搜索框输入联想、窗口resize监听。

节流:固定时间间隔内仅执行一次,稀释触发频率。适用场景:滚动加载、高频按钮防重复点击。

核心区别:防抖合并多次为一次,节流均匀控制执行频率。

六十二、ConcurrentHashMap 线程安全的具体实现方式?(快手后端、小米后端)

一句话总结:

ConcurrentHashMap通过分段锁+CAS机制实现线程安全:1.JDK7采用Segment分段锁,不同段可并发操作;2.JDK8改为Node数组+链表/红黑树,使用synchronized锁单个桶节点;3.volatile保证变量可见性;4.CAS实现无锁化原子操作;5.扩容时多线程协同迁移数据。

六十三、什么是 LRU 算法?(快手后端)

一句话总结:

LRU(Least Recently Used)算法是一种缓存/页面置换策略:始终优先淘汰“最后一次被访问时间最久远”的那一项,用时间局部性原则来最大化命中率。 

六十四、说说Redis的大key,为什么会产生大key?(小米后端)

一句话总结:

Redis大Key指存储超大值(如字符串过大、集合元素过多)的键。

主要成因包括:

1.设计不合理,未拆分数据结构;

2.业务需求(如缓存整页数据);

3.数据持续积累未清理;

4.使用不当的集合类型(如无序存储海量数据)。

大Key易引发内存不均、操作阻塞等问题。

六十五、GET 与 POST 有什么区别?(百度后端)

一句话总结:

GET=“只拿不改”;POST=“提交或创建”。二者在语义、幂等性、缓存、参数位置、安全性等方面都有官方规定,也有“江湖惯例”。

六十六、什么是数据库事务?(百度后端)

一句话总结:

数据库事务是由一组不可分割的数据库操作序列组成的逻辑单元,确保操作要么全部成功(提交),要么全部失败(回滚),以维护数据的完整性和一致性。

ACID特性(原子性、一致性、隔离性、持久性)

六十七、