RT-DETRv2 中的坐标回归机制深度解析:为什么用 `sigmoid(inv_sigmoid(ref) + delta)` 而不是除以图像尺寸?

引言:一个看似简单的公式,背后藏着工业级设计智慧

在阅读 RT-DETRv2(Real-Time DETR v2)源码时,我曾被一行代码深深震撼:

inter_ref_bbox = F.sigmoid(bbox_head[i](output) + inverse_sigmoid(ref_points_detach))

这行代码没有卷积、没有注意力、没有复杂的损失函数——它只是一个Sigmoid + 反Sigmoid + 加法的组合。但正是这个“简单”操作,让 RT-DETRv2 实现了:

  • 任意输入尺寸下稳定预测
  • 无需传入图像宽高即可训练和推理
  • 多尺度、移动端、边缘设备无缝适配
  • 比 YOLOv8 更轻量、比 DETR 更快、精度更高

很多人看到这行代码只觉得“哦,是做归一化”,但真正理解它的设计哲学,才能明白为何 RT-DETRv2 能在 Real-Time Detection 领域成为标杆。

本文将从数据流、数学原理、工程实现、工业对比、损失函数设计五个维度,彻底拆解这行代码背后的深层逻辑。读完本文,你将不再困惑:

  • “为什么不用 x / W?”
  • “为什么非得用 sigmoid?”
  • “这跟特征图有关系吗?”
  • “为什么 Loss 计算也不依赖模型输入尺寸?”

一、背景:RT-DETRv2 是什么?

RT-DETRv2 是由百度提出的实时目标检测模型,是 DETR 系列的进化版。它在保持 Transformer 架构优势的同时,通过以下创新实现了速度与精度的双赢

特性说明
无 NMS基于查询机制直接输出最终框
高效解码器使用 Hybrid Encoder + Iterative Refinement
动态参考点每层迭代优化边界框位置
分辨率无关所有坐标、Loss、预测均基于原始图像归一化

其中,“动态参考点迭代更新” 是其核心机制,而我们今天要深挖的公式,正是这一机制的数学核心:

inter_ref_bbox = F.sigmoid(bbox_head[i](output) + inverse_sigmoid(ref_points_detach))

二、坐标归一化:到底该归一化到哪个空间?

❌ 常见误区:用 x / W, y / H 归一化?

在 Faster R-CNN、YOLO、SSD 等传统检测器中,标注框通常按如下方式归一化:

cx_norm = (x1 + x2) / 2 / image_width
cy_norm = (y1 + y2) / 2 / image_height
w_norm = (x2 - x1) / image_width
h_norm = (y2 - y1) / image_height

问题来了:如果模型输入图像经过 resize 和 padding,比如:

项目
原始图像300×400
模型输入640×640(经缩放+填充)

那么:

  • 标注框是基于 300×400 的(如 [50, 80, 200, 300]
  • 输入图像中的实际像素坐标是 [80, 168, 320, 520]
  • 如果我们用 x / 640 来归一化 → 得到 [0.125, 0.2625, 0.5, 0.8125]

👉 这时模型学到的是“在 640×640 图像中的相对位置”

但当你部署时换成 800×800 输入,模型预测出的 [0.125, ...] 就会错得离谱 —— 因为它不知道“0.125”对应的是原图的 50 像素,还是 64 像素!

✅ 正确做法:永远以原始图像为基准归一化

RT-DETRv2 的做法是:

无论输入图像被 resize 成多少,标签(GT)始终基于原始图像尺寸归一化。

即:

# 原始图像:H=300, W=400
gt_xyxy = [50, 80, 200, 300]  # 像素坐标# 归一化到原始图像空间
gt_norm = [(50 + 200)/2 / 400,   # cx = 0.3125(80 + 300)/2 / 300,   # cy = 0.6333(200 - 50) / 400,     # w  = 0.375(300 - 80) / 300      # h  = 0.7333
]

这个 [0.3125, 0.6333, 0.375, 0.7333] 就是模型唯一需要学习的目标!

📌 关键结论:模型预测的每一个 [cx, cy, w, h] ∈ [0,1],都是相对于“原始图像”的比例,而不是当前输入图像!


三、为什么需要 inverse_sigmoid + sigmoid?这是什么魔法?

1️⃣ 问题:不能直接加吗?ref + delta 行不行?

假设上一层参考点是 ref = [0.3, 0.6, 0.4, 0.7](归一化坐标)

bbox_head 输出偏移量 delta = [0.1, 0.05, 0.05, -0.1]

如果我们直接加:

new_ref = ref + delta  # → [0.4, 0.65, 0.45, 0.6]

表面看没问题,但:

  • 如果 delta = [0.8, 0, 0, 0]new_ref = [1.1, 0.6, ...]超出 [0,1]!
  • 如果 delta = [-0.5, 0, 0, 0]new_ref = [-0.2, ...]负值非法!

→ 必须做 clamp(0,1) 保护?
❌ 不行!clamp 不可导,破坏梯度流,导致训练不稳定!

2️⃣ 解决方案:在 logit 空间做加法!

RT-DETRv2 引入了经典技巧(源自 Deformable DETR):

logit_ref = inverse_sigmoid(ref)   # 将 [0,1] 映射到 (-∞, +∞)
logit_new = logit_ref + delta      # 在实数域自由加法
new_ref = sigmoid(logit_new)       # 再映射回 [0,1]

其中:

def inverse_sigmoid(x, eps=1e-5):x = x.clamp(min=eps, max=1-eps)return torch.log(x / (1 - x))

3️⃣ 数学本质:在概率空间中做残差更新

坐标类比
cx ∈ [0,1]概率分布的均值(如“物体出现在左侧的概率为 0.3”)
inverse_sigmoid把概率转成“对数几率”(log-odds),便于建模变化
delta对“语义位置”的修正量(类似 ResNet 的残差)
sigmoid把修正后的 log-odds 转回概率空间

✅ 这就像:
“昨天你觉得车在门左边 30% 处(0.3),今天你发现它其实更靠左一点 → 你给它加了个 ‘+0.1 的 logit 偏移’ → 最终认为是 0.4。”

这种设计天然保证输出合法、梯度连续、收敛稳定

4️⃣ 为什么不用 tanh、softplus、clamp?

方法是否推荐原因
sigmoid✅ 推荐输出 [0,1],完美匹配坐标范围,可导,稳定
tanh❌ 不推荐输出 [-1,1],需额外线性变换:(tanh(x)+1)/2,增加复杂度
clamp(x, 0, 1)❌ 绝对禁止不可导,梯度截断,训练崩溃风险高
softplus❌ 不合适输出 >0,无法约束上界

💡 Sigmoid 是“有界回归”的黄金标准,正如 Softmax 是分类的黄金标准。


四、最核心洞察:为什么不用 x / W?—— 解耦图像尺寸的革命性设计

这才是全文最精华的部分!

❌ 传统方法(YOLO、Faster R-CNN)的致命缺陷:

# 假设你训练时输入 640×640
pred_cx_feat = model(...)  # 输出在特征图上的坐标,如 24.5
pred_cx_img = pred_cx_feat * 32 / 640  # 乘 stride,再除 input_w

⚠️ 问题暴露:

场景问题
训练:640×640OK
推理:800×800pred_cx_img = 24.5 * 32 / 800 = 0.98 → 错了!应是 0.78
推理:512×51224.5 * 32 / 512 = 1.53 → 超出 [0,1]!必须 clamp

👉 模型硬编码了输入尺寸!它学会的是:“当输入是 640 时,24.5 对应 0.3125”。

这不是“理解场景”,而是“背公式”。

✅ RT-DETRv2 的革命:完全脱离物理尺寸依赖

# 无论输入是 320×320、640×640、1280×1280
# 模型只关心:
# “这个视觉模式,对应原始图像中的哪个相对位置?”
  • 标签:始终是 [0.3125, 0.6333, ...](基于原始 300×400)
  • 预测:输出也是 [0.32, 0.64, ...](同样是基于原始 300×400)
  • 还原:测试时只需知道原始图像尺寸(如 300×400),就能还原真实像素:
x1 = (cx - w/2) * orig_w
y1 = (cy - h/2) * orig_h

🌟 模型从未接触过 640×640!它只学到了“语义位置”

🧠 类比理解:

场景传统方法RT-DETRv2
描述一个人的位置“他在房间左边第 2.5 米处”“他在门的左边三分之一处”
依赖什么?房间大小(6米宽)无需知道房间大小
换房间还能用吗?❌ 必须重新校准✅ 完全通用

✅ RT-DETRv2 学会的是“相对语义定位”,不是“像素计算”。


五、关键升华:RT-DETRv2 的 Loss 函数也完全与模型输入尺寸无关!

这是很多博客、教程忽略的最重要一环!

在大多数检测框架中(如 YOLO、Faster R-CNN),Loss 计算是在模型输入空间进行的

# YOLOv8 示例(伪代码)
pred_boxes = model_output  # shape [B, N, 4] —— 基于 640x640 的归一化
target_boxes = gt_boxes_normalized_to_640  # 也是基于 640x640loss_iou = giou_loss(pred_boxes, target_boxes)

👉 一旦你换输入尺寸(如 800×800),你就必须:

  1. 重新归一化 GT 到 800×800
  2. 修改 Loss 中的尺度因子
  3. 可能还要重训模型!

❌ 传统方式的灾难性后果:

输入尺寸GT 坐标(归一化)模型预测(归一化)Loss 计算结果
640×640[0.3125, 0.6333][0.32, 0.64]IoU = 0.98 ✅
800×800[0.3125, 0.6333] ← 原始图像归一化![0.32, 0.64]IoU = 0.79 ❌(因为模型以为是 800 空间)

Loss 误判!模型学歪了!

✅ RT-DETRv2 的正确做法:

所有 Loss(CIoU、GIoU、L1、Focal)都基于“原始图像归一化坐标”计算!

# 数据加载阶段:
orig_w, orig_h = 400, 300  # 原始图像尺寸
gt_boxes_xyxy = torch.tensor([[50, 80, 200, 300]], dtype=torch.float32)# ✅ 归一化到原始图像空间(唯一标准)
gt_norm = gt_boxes_xyxy.clone()
gt_norm[:, [0,2]] /= orig_w
gt_norm[:, [1,3]] /= orig_h# 模型输入:resize 到 640×640,但 gt_norm 不变!# 模型输出:pred_boxes.shape = [B, N, 4], values in [0,1] —— 同样是相对于原始图像!# ✅ LOSS 计算:直接比较两个 [0,1] 坐标,不涉及任何尺寸!
loss_l1 = F.l1_loss(pred_boxes, gt_norm)
loss_giou = generalized_iou_loss(pred_boxes, gt_norm)

📌 这意味着:

  • 模型训练时输入是 640×640,Loss 用的是原始 300×400 的归一化坐标;
  • 模型推理时输入是 1280×1280,Loss 仍然用的是原始 300×400 的归一化坐标;
  • Loss 的计算空间 = 标签的空间 = 预测的空间 = 原始图像归一化空间

🎯 模型学到的不是“在 640 上怎么预测”,而是“在真实世界中,目标应该在哪里”。

这就是为什么 RT-DETRv2 可以做到:

  • 一套模型,适配任意分辨率输入
  • 无需重新标注、无需重新训练
  • 无需修改 Loss 函数、无需调整超参

这是真正的端到端、跨尺度、自适应检测系统


六、实验验证:真实还原效果

假设:

  • 原始图像:300×400
  • GT:[50, 80, 200, 300] → 归一化后:[0.3125, 0.6333, 0.375, 0.7333]
  • 模型预测:[0.32, 0.64, 0.38, 0.72]

还原到原始图像:

x1 = (0.32 - 0.38/2) * 400 = (0.32 - 0.19) * 400 = 52
y1 = (0.64 - 0.72/2) * 300 = (0.64 - 0.36) * 300 = 84
x2 = (0.32 + 0.38/2) * 400 = 204
y2 = (0.64 + 0.72/2) * 300 = 300

→ 预测框:[52, 84, 204, 300]
→ GT 框:[50, 80, 200, 300]
IoU ≈ 0.98!完美拟合!

📌 即使你在训练时用了 640×640 输入,只要标签和 Loss 都基于原始归一化坐标,预测结果依然能准确还原!


七、工程实现建议(实战代码)

✅ 数据加载阶段(关键!)

# 假设你使用 torchvision 或自定义 dataloader
orig_w, orig_h = image.width, image.height  # 原始尺寸:300, 400# 标注是像素坐标
gt_boxes_xyxy = torch.tensor([[50, 80, 200, 300]], dtype=torch.float32)# ✅ 永远按原始图像归一化!不要管输入尺寸!
gt_boxes_xyxy_norm = gt_boxes_xyxy.clone()
gt_boxes_xyxy_norm[:, [0, 2]] /= orig_w
gt_boxes_xyxy_norm[:, [1, 3]] /= orig_h# 然后进行 resize & pad 到 640x640
image_resized = F.resize(image, size=(640, 640))
# 但 gt_boxes_xyxy_norm 保持不变!传给模型的就是这个!model_input = image_resized
model_target = gt_boxes_xyxy_norm  # shape: [1, 4], values in [0,1]

✅ 模型中核心代码(RT-DETRv2 风格)

import torch.nn.functional as Fdef inverse_sigmoid(x, eps=1e-5):x = x.clamp(min=eps, max=1 - eps)return torch.log(x / (1 - x))# 假设:ref_points_detach 来自上一层,shape [B, N, 4]
# bbox_head[i] 输出 delta,shape [B, N, 4]logit_ref = inverse_sigmoid(ref_points_detach)
logit_new = logit_ref + bbox_head[i](output)
inter_ref_bbox = F.sigmoid(logit_new)  # ✅ 新参考点,仍在 [0,1]

✅ Loss 计算部分(重点!)

# pred_boxes: [B, N, 4] —— 模型输出,归一化到原始图像
# gt_boxes: [B, N, 4] —— 标签,归一化到原始图像loss_l1 = F.l1_loss(pred_boxes, gt_boxes, reduction='none')
loss_giou = 1 - generalized_iou_loss(pred_boxes, gt_boxes)total_loss = loss_l1.mean() + loss_giou.mean()

⚠️ 注意:不要对 pred_boxes 或 gt_boxes 做任何形式的缩放或除以 input_w/h!


八、RT-DETRv2 vs YOLOv8 vs Deformable DETR 对比

特性RT-DETRv2YOLOv8Deformable DETR
坐标归一化基准✅ 原始图像❌ 输入图像(640)❌ 特征图网格
Loss 计算空间✅ 原始图像归一化空间❌ 输入图像归一化空间❌ 特征图空间
是否依赖输入尺寸❌ 否✅ 是✅ 是
是否支持动态输入✅ 是❌ 否(需固定)❌ 否
是否可导✅ 完全可导✅ 可导✅ 可导
梯度稳定性✅ 极高(logit 空间)✅ 中等⚠️ 较低(易漂移)
工业部署友好度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
推理速度⚡ 极快(无 NMS)⚡ 极快🐢 慢

RT-DETRv2 是目前唯一在保持端到端、高精度、超高速的同时,实现“分辨率无关”且“Loss 独立于输入尺寸”的检测框架。


九、为什么这设计如此重要?—— 工业部署的终极答案

想象你的应用场景:

场景传统模型问题RT-DETRv2 优势
手机 APP用户拍照分辨率不一致(iPhone 15:4032×3024,红米:1920×1080)一套模型通吃,无需改代码
多摄像头监控系统摄像头型号不同,分辨率各异无需为每个摄像头单独训练模型
边缘设备(Jetson Nano)内存有限,不能存 img_w/h只需存储预测结果 [cx,cy,w,h] 即可
云端服务支持任意上传图片尺寸自动适配,无需预处理校准

📌 RT-DETRv2 的设计,是真正为“现实世界”而生的。

它不追求论文里的“最高 mAP”,它追求的是:

“在任何设备、任何尺寸、任何环境下,都能稳定、准确、快速地工作。”

这就是工业 AI 的终极目标。


总结:一句话读懂 RT-DETRv2 的灵魂

F.sigmoid(bbox_head(...) + inverse_sigmoid(ref)) 不是数学技巧,而是一种认知升级:
它让模型不再计算“像素比例”,而是理解“场景中的相对位置”。

它用 Sigmoid 替代了 x / W
用 Logit 空间替代了像素空间,
用语义抽象替代了几何计算。

更关键的是:它的 Loss 函数,也完全基于原始图像归一化坐标计算,与模型输入尺寸零耦合。

这才是现代检测器从“工程实现”走向“智能感知”的标志。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96703.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单了解一下GraphRAG

传统RAG的缺点 当我们将一段文本信息以句子分割后,存入到向量数据库中。用户提问“老王喜欢吃什么”,这个问题会与向量数据库中的许多句子关联性比较强,能返回准确且具体的信息。 但是,若是问题换成“出现了几次西瓜”&#xff0c…

HTTP 状态码背后的逻辑:从请求到响应的完整流程解析(含完整流程图)

在日常的 Web 开发与 API 调试中,我们经常会遇到各种 HTTP 状态码 ——404 Not Found、401 Unauthorized、500 Internal Server Error... 这些数字背后并非随机出现,而是服务器处理请求过程中不同阶段的 "反馈信号"。理解这些状态码的触发逻辑…

Vue:下拉框多选影响行高

目录 一、 出现场景二、 解决方案 一、 出现场景 在使用el-select增加multiple属性进行多选时&#xff0c;会出现高度塌陷的情况 二、 解决方案 首先需要在el-select中增加collapse-tags属性&#xff0c;并在style中增加如下样式 方案一 <style scoped> ::v-deep .e…

如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?

1.简介研华已将高通跃龙QCS6490 技术应用于嵌入式模块、单板电脑和AI摄像头等各种规格的嵌入式硬件中。QCS6490平台支持全面的操作系统生态系统&#xff0c;包括Windows、Ubuntu、Yocto和 Android。Windows 11 IoT企业版是微软新一代的物联网操作系统&#xff0c;具有更强的安全…

阿里云国际代理:如何利用RDS构建高可用、可扩展的数据库架构

讲下云数据库RDS案例解析&#xff0c;若在上云或用云过程中有不懂的&#xff0c;可寻云枢国际yunshuguoji助力免卡上云用云。1、RDS MySQL数据库代理支持读写分离、连接保持、就近访问、事务拆分、连接池、SSL加密等功能&#xff0c;能够降低主实例负载&#xff0c;提高实例可用…

C++之特殊类设计

文章目录前言一、 设计一个不能被拷贝的类1. C98 实现方式2. C11 实现方式二、设计一个只能在堆上创建对象的类1. 方法一&#xff1a;析构函数私有&#xff0c;提供destory接口释放资源2. 方法二&#xff1a;构造函数私有三、 设计一个只能在栈上创建对象的类1. 实现方式四、设…

TupiTube,一款免费开源的 2D 动画创作工具

TupiTube&#xff0c;一款免费开源的 2D 动画创作工具 ** ** 功能 ** &#xff1a;开源、免费的 2D 动画软件&#xff0c;界面简单&#xff0c;支持逐帧动画、剪纸动画、定格动画&#xff0c;能导入素材并导出多种视频和图片格式&#xff0c;适合儿童、学生和动画爱好者入门创作…

MoE架构训练系统设计:专家并行与门控网络优化策略

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 摘要 混合专家&#xff08;Mixture of Experts&#xf…

使用Python爬虫,selenium和requests谁更强?

py爬虫的话&#xff0c;selenium和reqeusts谁更强&#xff0c;selenium是不是能完全取代requests? 答案基本是可以的&#xff0c;selenium适合动态网页抓取&#xff0c;因为它可以控制浏览器去点击、加载网页&#xff0c;requests则比较适合静态网页采集&#xff0c;它非常轻…

编译原理-文法压缩练习

这个任务的目标就是把一个给定的文法变得“干净”和“高效”&#xff0c;剔除所有无用的部分。根据幻灯片&#xff0c;无用的&#xff08;多余的&#xff09;规则分为两大类&#xff1a; 不可达规则&#xff1a;规则的“头”&#xff08;左部非终结符&#xff09;从起始符号出发…

GPU硬件架构和配置的理解

从公司架构理解GPU架构想象一个GPU就像一家大型科技公司&#xff0c;它的任务是处理图形和计算任务&#xff08;“干活”&#xff09;。硬件概念公司架构比喻作用和特点Platform (平台)集团公司最大的独立实体。比如谷歌Alphabet是一个集团公司&#xff0c;它旗下有谷歌、Waymo…

【硬件开发】电源抑制比PSRR

电源抑制比PSRR是电压输入量和电压输出量的比值&#xff0c;通常用dB来表示。 PSRR这个参数经常和运放&#xff0c;LDO,DCDC变换器有关联。(2 封私信 / 58 条消息) 电源抑制比(PSRR)的基础知识 - 知乎

七、卷积神经网络

目录 7.1 整体结构 7.2 卷积层 7.2.1 全连接层存在的问题 7.2.2 卷积运算 7.2.3 填充 7.2.5 3维数据的卷积运算 7.2.6 结合方块思考 7.2.7 批处理 7.3 池化层 7.4 卷积层和池化层的实现 7.4.1 4维数组 7.4.2 基于 im2col的展开 7.4.3 卷积层的实现 7.4.4 池化层的…

加餐加餐!烧烤斗破苍穹

忽然起了吃烧烤的念头&#xff0c;便掏出手机点了一堆。不过二十分钟&#xff0c;外卖小哥便按响了门铃&#xff0c;手里提着一个方正的纸袋&#xff0c;还冒着热气。我将烧烤一一取出&#xff0c;排在茶几上。肉串油光发亮&#xff0c;韭菜翠绿间点缀着蒜蓉&#xff0c;茄子剖…

搜索引擎收录网站带www和不带www有区别吗?

这是一个非常常见且重要的问题。简单直接的回答是&#xff1a;有区别&#xff0c;但对搜索引擎来说&#xff0c;处理得当就不会重复&#xff1b;处理不当则会造成严重重复和权重分散。下面我为您详细解释一下&#xff0c;并提供正确的处理方法。核心区别&#xff1a;两个不同的…

AFSim2.9.0学习笔记 —— 2、AFSim的Wizard软件概述(ArkSIM集成开发环境 (IDE))

&#x1f514; AFSim2.9.0 相关技术、疑难杂症文章合集&#xff08;掌握后可自封大侠 ⓿_⓿&#xff09;&#xff08;记得收藏&#xff0c;持续更新中…&#xff09; 若还没有下载AFSim2.9.0完整软件或源码&#xff0c;请先进入本人另篇文章了解下载。 正文 ▪️主界面 打开 Ar…

建自己的Python项目仓库,使用工具:GitHub(远程仓库)、GitHub Desktop(版本控制工具)、VSCode(代码编辑器)

结合 GitHub&#xff08;远程仓库&#xff09;、GitHub Desktop&#xff08;版本控制工具&#xff09;、VSCode&#xff08;代码编辑器&#xff09; 三个工具&#xff0c;以下是更具体的Python项目仓库搭建流程&#xff0c;包含工具协同操作的详细步骤&#xff1a; 一、整体流程…

iDEA Lombok 失效 和 slf log 变量失效问题

1. lombok 失效&#xff1a;检查下配置有没有使用注解处理器&#xff1b;且这个处理中有没有带上版本&#xff1b;版本号需要与上面引入的依赖版本一致。2. 对于找不到 log 变量的操作&#xff0c;则是使用下面将这个变量使用下面的代码定义出来&#xff1b;上面去掉 slf4j注解…

go资深之路笔记(二) sync.Pool

一、 使用 sync.Pool 减少 GC 压力&#xff0c;提升性能 简单讲下go的gc&#xff0c;它的核心原理就是三色标记法和写屏障&#xff0c;可以实现优秀并发处理。gc一般不会频繁调用&#xff0c;他是根据GOGC的值来判断&#xff0c;具体就是上次触发GC后总堆值大于等于上次的(1GO…

【面试笔记-Java开发岗】

目录&#xff1a;1. synchronized 和 ReentrantLock 的区别及应用场景2. HashMap 与 LinkedHashMap 的区别3. ConcurrentHashMap 的数据结构及 JDK1.7 与 JDK1.8 区别4. Spring 常用的模式及应用场景5. 事务的四大特性&#xff08;ACID&#xff09;6. 锁机制&#xff1a;行级锁…