为什么互联网大厂不推荐使用多表 join?
互联网大厂不推荐使用多表JOIN,主要基于性能瓶颈、可扩展性差、与微服务架构冲突三大核心原因。在高并发、海量数据的互联网场景下,JOIN操作会产生大量中间结果集,消耗大量CPU和内存资源,容易成为慢查询拖垮数据库。在分库分表架构下,跨物理节点的JOIN查询变得异常复杂甚至无法执行,同时强依赖其他服务的数据库表进行JOIN也违反了微服务边界的封装性。…
2026-1-06 8:30
|
1299 字
|
5 分钟
在java中HashMap是怎么解决哈希冲突的?
HashMap 主要通过以下几种方式解决哈希冲突: 1. 链表法(拉链法) 这是HashMap最基本的冲突解决方式: 每个数组元素(桶)存储一个链表 当多个key的哈希值相同(哈希碰撞)时,这些键值对会以链表形式存储在同一个桶中 新元素插入到链表头部(Java 8改为尾部插入) // 简化示意图 [0] -> null [1]…
2025-12-28 10:27
|
511 字
|
3 分钟
spring中BeanFactory和FactoryBean区别?
BeanFactory 和 FactoryBean 是 Spring 中两个完全不同的概念,虽然名称相似但功能不同: 1. BeanFactory 核心概念 Spring IoC 容器的根接口,是 Spring 容器的基础 实现了工厂模式,用于创建和管理 Bean 是所有 Spring 容器的顶层接口 主要功能 // BeanFactory 接口定…
2025-12-28 10:23
|
576 字
|
6 分钟
Redisson分布式锁为什么要用lua脚本实现,而不用事务?
Redisson使用Lua脚本实现分布式锁主要是为了解决原子性、网络开销和事务局限性三个核心问题。下面详细解释: 1. 原子性保证 这是最主要的原因。Lua脚本在Redis中执行时是原子性的,整个脚本在执行过程中不会被其他命令打断。 -- Redisson的加锁Lua脚本示例 if (redis.call('exists', KEYS[1]…
2025-12-28 10:21
|
704 字
|
5 分钟
mysql 数据去重用DISTINCT还是GROUP BY?
在数据去重时,DISTINCT 和 GROUP BY 都可以实现去重功能,但它们在语义、性能和功能上有重要区别: 1. 基本用法对比 DISTINCT -- 简单去重 SELECT DISTINCT department, job_title FROM employees; -- 与聚合函数结合 SELECT COUNT(DISTINCT depa…
2025-12-28 10:18
|
571 字
|
5 分钟
为什么重写 equals()就必须要同时重写 hashCode()?
这是一个非常经典的Java面试题。重写 equals() 时必须重写 hashCode() 主要是为了维护 hashCode方法的通用约定,确保基于哈希的集合(如 HashMap、HashSet、Hashtable)能够正常工作。 根本原因:hashCode 方法的约定 在 Object类的规范中,hashCode()方法有以下重要约定: 一致性:…
2025-12-28 10:16
|
720 字
|
6 分钟
Redis是如何实现IO多路复用的?
Redis 通过使用操作系统提供的 IO 多路复用 机制来实现高性能的网络通信,使得单个线程能够同时处理多个客户端连接。以下是其核心实现方式: 1. 支持的 IO 多路复用模型 Redis 在运行时自动选择系统最高效的多路复用模型(按优先级): epoll(Linux) kqueue(FreeBSD/macOS) select(跨平台,但效率较低…
2025-12-28 10:13
|
752 字
|
4 分钟
有三个线程T1,T2,T3 怎么确保都按顺序执行?
确保多个线程按顺序执行(T1→T2→T3)是常见的线程同步问题。以下是几种解决方案: 1. 使用Thread.join()(最简单) public class ThreadJoinExample { public static void main(String[] args) throws InterruptedException { Th…
2025-12-28 10:11
|
591 字
|
17 分钟
springboot如何解决跨域问题?
在Spring Boot中解决跨域问题有几种常用方法,以下是详细的解决方案: 1. 使用@CrossOrigin注解(局部配置) 在控制器类或方法上添加注解 // 在控制器类上使用 @RestController @CrossOrigin(origins = "http://localhost:3000") @RequestMapping("/ap…
2025-12-28 10:07
|
496 字
|
9 分钟
Java 中 final、finally 和 finalize 各有什么区别?
在Java中,final、finally 和 finalize 是完全不同的三个概念,主要区别如下: 1. final(关键字) 作用:用于声明不可变的实体 修饰变量:变量一旦初始化就不能被修改(基本类型值不能变,引用类型引用不能变) 修饰方法:方法不能被子类重写(override) 修饰类:类不能被继承 // 1. final变量 final …
2025-12-27 20:50
|
566 字
|
5 分钟