# Java 后端知识地图

> 版本基线：Java 21、Spring Framework 6、Spring Boot 3.x。本文定义长期学习方向、当前方向的稳定课次与掌握门禁；每日课程仍按日期保存在独立目录中。

## 文件保护与自动维护边界

- 自动任务只能修改下方唯一一对 `JAVA-STUDY-AUTO` 标记之间的内容，不能改写标记本身。
- 标记之外是稳定定义和大大的个人笔记区。自动任务必须逐字保留，不得格式化、排序、补写或删除。
- `04-复盘作答.md` 始终属于用户数据；地图只能读取有效作答作为证据，不能创建、覆盖、格式化或删除答案文件。
- Day 表示累计学习次数；方向课次表示当前知识方向内的进度，两者互不替代。

<!-- JAVA-STUDY-AUTO:START -->
```yaml
schemaVersion: 1
updatedDate: 2026-09-14
current:
  direction: java-data-structures
  directionStatus: active
  directionSession: 19
  nextCurriculumItemId: challenge.map
  lastEvaluatedDay: null
  latestScore: null
directionStates:
  java-language: planned
  java-data-structures: active
  jvm: planned
  java-concurrency: planned
  java-io-network: planned
  sql-databases: planned
  persistence: planned
  spring-framework: planned
  spring-boot-web: planned
  backend-security: planned
  redis: planned
  messaging: planned
  distributed-microservices: planned
  docker-kubernetes: planned
  observability-concepts: planned
  system-design: planned
statistics:
  curriculumCoveragePercent: 28.57
  evaluatedCount: 0
  masteredCount: 0
  needsReviewCount: 0
  latestEvidence: "course:2026-09-14:day-21:challenge.map:variant-9"
  standardLessonsTotal: 35
  standardLessonsStarted: 10
  standardLessonsMastered: 0
  knowledgePointsTotal: 27
  knowledgePointsStarted: 9
  knowledgePointsMastered: 0
  sourceKnowledgePointsTotal: 9
  sourceKnowledgePointsStarted: 4
  sourceKnowledgePointsMastered: 0
  challengesTotal: 6
  challengesStarted: 1
  challengesMastered: 0
  capstonesTotal: 1
  capstonesMastered: 0
  finalsTotal: 1
  finalsMastered: 0
  openRedLines: 0
history:
  - day: 1
    date: 2026-08-24
    topic: 集合选型与 HashMap 核心结构
    assessment: historical_unassessed
    countsTowardMastery: false
  - day: 2
    date: 2026-08-25
    topic: HashMap.put 到 putVal 源码调用链
    assessment: historical_unassessed
    countsTowardMastery: false
  - day: 3
    date: 2026-08-26
    topic: "Map 契约重启：键的存在性、null 与返回值"
    directionSession: 1
    curriculumItemId: ds.map.contract
    lessonMode: new
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 4
    date: 2026-08-27
    topic: "Map 键相等性：equals/hashCode 契约与可变键陷阱"
    directionSession: 2
    curriculumItemId: ds.map.equality
    lessonMode: new
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 5
    date: 2026-08-28
    topic: "HashMap 核心结构：容量、阈值、负载因子、桶与结构修改"
    directionSession: 3
    curriculumItemId: ds.map.hashmap-structure
    lessonMode: new
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 6
    date: 2026-08-29
    topic: "Java 21 HashMap 源码专题：跟踪 put/get/remove 的定位、替换、碰撞与删除主链"
    directionSession: 4
    curriculumItemId: ds.map.hashmap-put-get-remove-source
    lessonMode: new
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 7
    date: 2026-08-30
    topic: "Java 21 HashMap 源码专题：推演 resize 低/高链拆桶、树化与退化边界，以及迭代器 fail-fast 主链"
    directionSession: 5
    curriculumItemId: ds.map.hashmap-resize-treeify-iterator-source
    lessonMode: new
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 8
    date: 2026-08-31
    topic: "Java 21 Map 条件更新与活视图：compute/merge 的 null 语义、写穿边界和安全快照"
    directionSession: 6
    curriculumItemId: ds.map.compute-merge-views
    lessonMode: new
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 9
    date: 2026-09-01
    topic: "Map 阶段复习：把键契约、HashMap 结构与源码、条件更新、活视图和快照串成一条后端决策链"
    directionSession: 7
    curriculumItemId: ds.map.compute-merge-views
    lessonMode: stage-review
    answerStatus: absent
    countsTowardCoverage: false
    countsTowardMastery: false
  - day: 10
    date: 2026-09-02
    topic: "Java 21 LinkedHashMap 源码专题：双向链、插入/访问顺序与 LRU 淘汰钩子"
    directionSession: 8
    curriculumItemId: ds.map.linkedhashmap-source
    lessonMode: new
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 11
    date: 2026-09-03
    topic: "Java 21 TreeMap 源码专题：比较定位、红黑树修复、导航查询与范围视图"
    directionSession: 9
    curriculumItemId: ds.map.treemap-source
    lessonMode: new
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 12
    date: 2026-09-04
    topic: "Java 21 专用 Map 选型：用 EnumMap、WeakHashMap 与 IdentityHashMap 表达不同的键语义和生命周期边界"
    directionSession: 10
    curriculumItemId: ds.map.specialized
    lessonMode: new
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 13
    date: 2026-09-05
    topic: "Map 阶段闯关：多租户退款索引的契约、状态推演、编码与源码解释"
    directionSession: 11
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    answerStatus: absent
    countsTowardCoverage: true
    countsTowardMastery: false
  - day: 14
    date: 2026-09-06
    topic: "Map 阶段闯关变式：仓储拣货波次调度索引的契约、状态推演、编码与源码解释"
    directionSession: 12
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    answerStatus: absent
    countsTowardCoverage: false
    countsTowardMastery: false
  - day: 15
    date: 2026-09-08
    topic: "Map 阶段闯关变式：多租户消息重试调度索引的契约、状态推演、编码与源码解释"
    directionSession: 13
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    answerStatus: absent
    countsTowardCoverage: false
    countsTowardMastery: false
  - day: 16
    date: 2026-09-09
    topic: "Map 阶段闯关变式：多商户对账差异升级索引的契约、状态推演、编码与源码解释"
    directionSession: 14
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    answerStatus: absent
    countsTowardCoverage: false
    countsTowardMastery: false
  - day: 17
    date: 2026-09-10
    topic: "Map 阶段闯关变式：多租户限流策略版本切换索引的契约、重排、编码与源码解释"
    directionSession: 15
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    answerStatus: absent
    countsTowardCoverage: false
    countsTowardMastery: false
  - day: 18
    date: 2026-09-11
    topic: "Map 阶段闯关变式：多仓库存预占过期批处理索引的契约、聚合、编码与源码解释"
    directionSession: 16
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    answerStatus: absent
    countsTowardCoverage: false
    countsTowardMastery: false
  - day: 19
    date: 2026-09-12
    topic: "Map 阶段闯关变式：多租户积分流水冲正与余额榜索引的契约、重排、重建与源码解释"
    directionSession: 17
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    answerStatus: absent
    countsTowardCoverage: false
    countsTowardMastery: false
  - day: 20
    date: 2026-09-13
    topic: "Map 阶段闯关变式：多租户风控案件调分与结案索引的契约、全序、快照与一致性"
    directionSession: 18
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    answerStatus: absent
    countsTowardCoverage: false
    countsTowardMastery: false
  - day: 21
    date: 2026-09-14
    topic: "Map 阶段闯关变式：多租户会员权益卡换卡与冻结索引的契约、重键、快照与一致性"
    directionSession: 19
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    answerStatus: absent
    countsTowardCoverage: false
    countsTowardMastery: false
standardLessonStates:
  ds.map.contract: covered_unverified
  ds.map.equality: covered_unverified
  ds.map.hashmap-structure: covered_unverified
  ds.map.hashmap-put-get-remove-source: covered_unverified
  ds.map.hashmap-resize-treeify-iterator-source: covered_unverified
  ds.map.compute-merge-views: covered_unverified
  ds.map.linkedhashmap-source: covered_unverified
  ds.map.treemap-source: covered_unverified
  ds.map.specialized: covered_unverified
  challenge.map: covered_unverified
  ds.set.contract-algebra: unstarted
  ds.set.hash-linked-source: unstarted
  ds.set.tree-navigable: unstarted
  ds.set.enum-boundary: unstarted
  challenge.set: unstarted
  ds.list.contract-arraylist: unstarted
  ds.list.arraylist-source: unstarted
  ds.list.linkedlist-deque-boundary: unstarted
  ds.list.iterator-views-copy: unstarted
  challenge.list: unstarted
  ds.queue.deque-arraydeque-source: unstarted
  ds.queue.priorityqueue-source: unstarted
  challenge.queue: unstarted
  ds.shared.hierarchy-sequenced: unstarted
  ds.shared.ownership-immutability: unstarted
  ds.shared.performance-capacity: unstarted
  challenge.shared: unstarted
  ds.concurrent.foundation-wrappers: unstarted
  ds.concurrent.concurrenthashmap-atomic-api: unstarted
  ds.concurrent.concurrenthashmap-source: unstarted
  ds.concurrent.copyonwrite-skiplist: unstarted
  ds.concurrent.concurrent-queues: unstarted
  challenge.concurrent: unstarted
  capstone.java-data-structures: unstarted
  final.java-data-structures: unstarted
evidence:
  - id: "course:2026-08-26:day-3:ds.map.contract"
    type: course_completed
    day: 3
    date: 2026-08-26
    directionSession: 1
    curriculumItemId: ds.map.contract
    lessonMode: new
    courseSourceSha256: "sha256:ca6d1670cae6314777321cace327795daafd4a654dc5b96ee8b5dac27e92dbb1"
    questionSourceSha256: "sha256:d7c959b398aff27c599e86d6e0b301fd45f23d7a28a64ac8b6da48e28a0b7266"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-08-27:day-4:ds.map.equality"
    type: course_completed
    day: 4
    date: 2026-08-27
    directionSession: 2
    curriculumItemId: ds.map.equality
    lessonMode: new
    courseSourceSha256: "sha256:ae9552f3b0e1fe22fe54b508f38d60ed3a3de5e48a9003e2f4541b2bf08c00ec"
    questionSourceSha256: "sha256:2c0214e82709a979faac3c01960fd146f0d6095c64013211acb9e13e94c3d38f"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-08-28:day-5:ds.map.hashmap-structure"
    type: course_completed
    day: 5
    date: 2026-08-28
    directionSession: 3
    curriculumItemId: ds.map.hashmap-structure
    lessonMode: new
    courseSourceSha256: "sha256:d9723d6ec9f31a6ab2ab1c350bd38b176e194aa0f682ae60b0bbafb4e36a5c88"
    questionSourceSha256: "sha256:641f8ced8d808f183ec8882b86244585787cbab0a05d846349b4da74cf9137b1"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-08-29:day-6:ds.map.hashmap-put-get-remove-source"
    type: course_completed
    day: 6
    date: 2026-08-29
    directionSession: 4
    curriculumItemId: ds.map.hashmap-put-get-remove-source
    lessonMode: new
    courseSourceSha256: "sha256:2f36b931ec3e0b055602ad4aaf90d7c838dc1c3f30587d9a5d1c9183c281900e"
    questionSourceSha256: "sha256:7b3bb3cfef6ccdab57feda395577471424faa58e9958d7a1205524e3f4184e83"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-08-30:day-7:ds.map.hashmap-resize-treeify-iterator-source"
    type: course_completed
    day: 7
    date: 2026-08-30
    directionSession: 5
    curriculumItemId: ds.map.hashmap-resize-treeify-iterator-source
    lessonMode: new
    courseSourceSha256: "sha256:74cb91ff66db5a5b95ed3c6f0e7049dc02882ff844e427380cacf1694ce9b496"
    questionSourceSha256: "sha256:ea11bfa8c8196b049f4c5e7c18a3037e7b6721e6d590cbfc009e6719dfb22d2d"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-08-31:day-8:ds.map.compute-merge-views"
    type: course_completed
    day: 8
    date: 2026-08-31
    directionSession: 6
    curriculumItemId: ds.map.compute-merge-views
    lessonMode: new
    courseSourceSha256: "sha256:aade42719327cd2742274f7972085e7879722a3792617a35918a691bcf4cc751"
    questionSourceSha256: "sha256:652bc5266b09685b59b3a0547d475007414e40548d47b1dde2aac84c578bd15a"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-01:day-9:ds.map.compute-merge-views:stage-review"
    type: course_completed
    day: 9
    date: 2026-09-01
    directionSession: 7
    curriculumItemId: ds.map.compute-merge-views
    lessonMode: stage-review
    courseSourceSha256: "sha256:e9aef0c4b2a9e89c8745a4f7be16ef5542f47101197642aaa2e5c6aea3bcbeb5"
    questionSourceSha256: "sha256:549e149fe842991ca5aa075f71cd200d00da08f36e3f5422e76a285700265e55"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-02:day-10:ds.map.linkedhashmap-source"
    type: course_completed
    day: 10
    date: 2026-09-02
    directionSession: 8
    curriculumItemId: ds.map.linkedhashmap-source
    lessonMode: new
    courseSourceSha256: "sha256:8ca2cb15a60a196be419bc1556b398d514f656f4496e750e33d10b081e26389b"
    questionSourceSha256: "sha256:40b0827afc87d21e822ffd2d3cb9ad45237364b4562217d65cc9ada523277239"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-03:day-11:ds.map.treemap-source"
    type: course_completed
    day: 11
    date: 2026-09-03
    directionSession: 9
    curriculumItemId: ds.map.treemap-source
    lessonMode: new
    courseSourceSha256: "sha256:216ae3dd553f1a0a1cdf9571323acff6b0770173259bef225f9fc3bc40657e01"
    questionSourceSha256: "sha256:7a02658cc1094453e709f45c7c877ef620474e432bb625ab82c5957b3db9ec67"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-04:day-12:ds.map.specialized"
    type: course_completed
    day: 12
    date: 2026-09-04
    directionSession: 10
    curriculumItemId: ds.map.specialized
    lessonMode: new
    courseSourceSha256: "sha256:f9e200af555c3057e13eabddbc126ea86b1c25c6c33fd00ab809b7529fa3256f"
    questionSourceSha256: "sha256:b352da8817a80b07ba06f595cfcd3a19e83756d654832b551ea73c732139ae2d"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-05:day-13:challenge.map"
    type: course_completed
    day: 13
    date: 2026-09-05
    directionSession: 11
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    courseSourceSha256: "sha256:f73a2e10ef7a2ee13810fe8d15e84f2f73181423d5875294fb64793ce1dca9f6"
    questionSourceSha256: "sha256:04d9c9268cbf408b4a62aad69cda9755d1fbb5e12bd164bcbcc730307e65c158"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-06:day-14:challenge.map:variant-2"
    type: course_completed
    day: 14
    date: 2026-09-06
    directionSession: 12
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    courseSourceSha256: "sha256:7d62e10e4ced7e220ff7652bd2251299291d67772ab6db52c2df50450145bc69"
    questionSourceSha256: "sha256:d3f951abc76931f4475e31c8c996b927931e7d2f1b33afc57023032f537467ee"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-08:day-15:challenge.map:variant-3"
    type: course_completed
    day: 15
    date: 2026-09-08
    directionSession: 13
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    courseSourceSha256: "sha256:cf5199e6dce6e4e23bed9a41e618c45ef81b26e192d5c3cc8c39065ad86a70fb"
    questionSourceSha256: "sha256:45be77e5674cd43acea0fe807bf8cdcaeb5a3ddd22209eba8ffc067a8e3ae90e"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-09:day-16:challenge.map:variant-4"
    type: course_completed
    day: 16
    date: 2026-09-09
    directionSession: 14
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    courseSourceSha256: "sha256:b79634598f9473f5c0612e8d084cc637186db7c9c77ee28ade871d4c51a04ab6"
    questionSourceSha256: "sha256:abe224ecee2ff4ac40945660714e72104b91bc15fa8bd5f07ef12df85fb5ebc8"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-10:day-17:challenge.map:variant-5"
    type: course_completed
    day: 17
    date: 2026-09-10
    directionSession: 15
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    courseSourceSha256: "sha256:deadd9c294030de113d4fdae48f08c2180e841fc5119299a538e15d46bff8658"
    questionSourceSha256: "sha256:3f2bd372377f603188f5b167aa98c9c33c03df8a0f4c14464794e74cde9e0476"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-11:day-18:challenge.map:variant-6"
    type: course_completed
    day: 18
    date: 2026-09-11
    directionSession: 16
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    courseSourceSha256: "sha256:794f18ca25ce3b571e211b87017f0e466b5cb80bbc0387e1ea49463755195be6"
    questionSourceSha256: "sha256:91a3bfcb17064352a52f1a38fa992740ac7cc436a5f9b3f2b8e8a28bbb60250e"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-12:day-19:challenge.map:variant-7"
    type: course_completed
    day: 19
    date: 2026-09-12
    directionSession: 17
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    courseSourceSha256: "sha256:1d4721ff5b951e41203266f17ac4dfd1d0d1723e6f0b2ae7d9768e6dd43ff4bf"
    questionSourceSha256: "sha256:27fdd5a1114650e88e4d2fed7595b51f416184cfe0de44030a33a9d37b732738"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-13:day-20:challenge.map:variant-8"
    type: course_completed
    day: 20
    date: 2026-09-13
    directionSession: 18
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    courseSourceSha256: "sha256:d3547cfff569403b0c39f20e9b820409926e19d64e7ff4f76ad4373a9138cb6d"
    questionSourceSha256: "sha256:b0a63d4cda496eeff0c5cf1574534fc8eb1a7fcdf4fc4b43291b81a2ed98b7b2"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
  - id: "course:2026-09-14:day-21:challenge.map:variant-9"
    type: course_completed
    day: 21
    date: 2026-09-14
    directionSession: 19
    curriculumItemId: challenge.map
    lessonMode: checkpoint
    courseSourceSha256: "sha256:8e0783e6d3f1c132354bcf1586d03819f56a9c5d4656686d9dd3b7d0f4a5535f"
    questionSourceSha256: "sha256:645e560c361f844d087fbc684e249558c9ebca679b8a1d6736ffa4e91c2f0b4a"
    answerSource: none
    answerRevision: null
    score: null
    redLines: []
    resultingState: covered_unverified
openRedLines: []
```
<!-- JAVA-STUDY-AUTO:END -->

## 一、状态模型

### 1. 标准项状态

27 个知识点、6 个闯关、综合项目和方向终验共用且只能使用以下五种状态：

| 状态 | 含义 |
|---|---|
| `unstarted` | 尚未正式安排；即使历史课程提到过，也没有本地图规则下的有效证据 |
| `covered_unverified` | 已讲解或阅读，但尚无足够作答、编码、推演或源码追踪证据 |
| `practicing` | 正在练习或等待本轮有效作答完成 |
| `needs_review` | 已评估但低于 80 分，或命中红线，需要针对性补救与重新验收 |
| `mastered` | 最新有效证据达到 80 分且没有红线；闯关、综合项目和终验以此表示通过 |

`current.nextCurriculumItemId` 单独指向下一节稳定 ID，不是第六种状态。源码型知识点也属于 27 个知识点，状态规则完全相同；“读过源码”不能代替可验证的调用链、字段或调试证据。

### 2. 知识方向状态

| 状态 | 含义 |
|---|---|
| `planned` | 已进入全景地图，但尚未被大大选为当前方向 |
| `active` | 当前持续学习的唯一方向 |
| `needs_review` | 方向终验或关键闯关暴露缺口，正在方向内补救 |
| `mastered_waiting_selection` | 当前方向已满足全部门禁，等待大大选择下一个方向 |
| `mastered` | 已掌握且大大已经完成下一方向选择 |

任一时刻最多有一个方向处于 `active` 或 `needs_review`。达到当前方向门禁后，必须先进入 `mastered_waiting_selection`，不得按固定顺序自动激活其他方向；只有大大明确选择后，才把原方向改为 `mastered`，并把所选 `planned` 方向改为 `active`。

处于 `mastered_waiting_selection` 时每日课程仍照常生成：安排一节当前方向的间隔复习或迁移练习，并给出 2～3 个候选方向及选择依据，直到大大明确选择。自动任务不得擅自固定 7/14/30 天复习间隔，也不得只写一个“等待选择”的空目录。

### 3. Day 1 与 Day 2 的历史口径

Day 1 和 Day 2 生成时尚未采用本地图的评分门禁，且没有可核验的有效作答，因此固定记为 `historical_unassessed`：

- 它们可以继续作为先修和复习材料；
- 它们不增加“已开始、已掌握、闯关通过或源码掌握”计数；
- 当前正式入口仍为 `ds.map.contract`；若大大已具备相关能力，可以用诊断题取得证据，而不是机械重复旧课。

### 4. 日常推进与门禁课

- 普通知识课完成但当天没有有效作答时，把对应知识点记为 `covered_unverified`；这不会阻塞内容覆盖，次日继续当前方向的下一个知识点。
- 普通知识课的作答可提前形成掌握证据；没有作答也不能被记作 `needs_review`，更不能因等待答案而原地重复同一课。
- 一个分类的知识内容覆盖完后，才进入对应 `challenge.*`。闯关可同时验证并更新其覆盖的多个知识点；不足部分进入补强课，使用新数据和新场景重新验收。
- 真正形成方向门禁的是分类闯关、闯关后的补强、综合项目与方向终验。它们未达到 80 分或命中红线时留在当前方向补救，不能切换方向。

## 二、评分、红线与方向门禁

### 1. 闯关、综合项目与终验的统一 100 分评分

| 维度 | 分值 | 评价重点 |
|---|---:|---|
| 契约与选型 | 25 | 集合契约、API 行为和业务选型准确 |
| 复杂度与状态推演 | 25 | 能由输入与关键字段变化推出结果，并说明平均、摊销和最坏成本 |
| 编码 | 30 | Java 21 代码可运行，结果满足业务语义与边界 |
| 源码讲解 | 20 | 能以固定版本的入口、字段和主调用链解释行为 |

标准项只有在最新有效证据达到 **80/100** 且没有命中红线时才能变为 `mastered`。未提交有效证据时最多为 `covered_unverified` 或 `practicing`，不能把“未作答”记作失败或掌握。

闯关通过还要求编码部分能够以 Java 21 成功编译并产生题目规定的预期结果；即使总分达到 80 且没有其他红线，只要编译失败或结果不符，就不得通过。

### 2. 红线规则

出现任一红线时，即使总分达到 80 也必须进入 `needs_review`；完成不同数据或不同业务场景的补救后方可重新验收：

1. 把 `HashMap` / `HashSet` 的迭代顺序当作稳定顺序契约。
2. 违反 `equals` / `hashCode` 或 `Comparator` 契约，或使用可变键后仍宣称查找可靠。
3. 混淆视图与副本，把活视图、防御性复制、只读包装或不可变集合误认为彼此等价。
4. 宣称 `LinkedList` 在不知道节点位置时进行中间插入仍是 `O(1)`。
5. 把 fail-fast 当作线程安全保证，或依赖它可靠检测所有并发修改。
6. 把 `ConcurrentHashMap` 的单键原子 API 扩大解释成跨键或跨集合操作自动原子。

### 3. `java-data-structures` 掌握门禁

只有同时满足以下条件，当前方向才可由 `active` 或 `needs_review` 变为 `mastered_waiting_selection`：

- 6 个闯关均达到 80 分且无红线，并记为 `mastered`；
- `capstone.java-data-structures` 达到 80 分且无红线，并记为 `mastered`；
- `final.java-data-structures` 达到 80 分且无红线，并记为 `mastered`；
- `openRedLines` 为空。

27 个知识点要按课程表完成内容覆盖，但不要求每项另交一次答案形成独立门槛。闯关证据可以批量更新其覆盖的知识点：证据充分的项目变为 `mastered`，尚未充分验证的项目可保持 `covered_unverified`；方向是否通过只按上述 6 个闯关、综合项目与终验门禁判断。

低分不会让课程停滞。自动任务应定位失分 ID，生成不同数据、不同业务背景或更小步的补救课；不得原样重复上一课，也不得在门禁通过后擅自选择下一方向。

## 三、后端 16 个知识方向全景

这 16 个方向是平级全景，不预锁下一方向，也不暗示必须按表格顺序学习。除当前方向外均从 `planned` 开始，由大大在每个方向掌握后选择下一项。

| 方向 ID | 知识方向 | 核心能力 | 初始状态 |
|---|---|---|---|
| `java-language` | Java 语言 | 语言基础、泛型、反射、代理、类加载与 API 设计 | `planned` |
| `java-data-structures` | 数据结构 | 集合契约、实现、复杂度、源码与并发集合边界 | `active` |
| `jvm` | JVM | 运行时内存、字节码、对象、GC 与诊断 | `planned` |
| `java-concurrency` | 并发 | Java 内存模型、线程池、锁、AQS 与并发设计 | `planned` |
| `java-io-network` | I/O 与网络 | NIO、协议、连接、序列化与服务端网络模型 | `planned` |
| `sql-databases` | SQL 与数据库 | 查询、索引、事务、锁、隔离与数据建模 | `planned` |
| `persistence` | 持久化 | JDBC、ORM、Spring Data 与一致性边界 | `planned` |
| `spring-framework` | Spring Framework | IoC、DI、Bean 生命周期、AOP、MVC 与事务源码 | `planned` |
| `spring-boot-web` | Spring Boot / Web | 启动、自动配置、条件装配、配置绑定与 REST | `planned` |
| `backend-security` | 安全 | 身份、授权、Spring Security 与常见攻击防护 | `planned` |
| `redis` | Redis | 数据结构、缓存策略、并发控制与一致性 | `planned` |
| `messaging` | 消息 | 幂等、顺序、重试、积压与事件驱动 | `planned` |
| `distributed-microservices` | 分布式 / 微服务 | 服务边界、发现、韧性、事务与一致性 | `planned` |
| `docker-kubernetes` | Docker / Kubernetes | 镜像、容器、编排、资源与发布 | `planned` |
| `observability-concepts` | 可观测性概念 | 指标、追踪、告警和故障定位方法 | `planned` |
| `system-design` | 系统设计 | 容量、性能、可靠性、安全与演进权衡 | `planned` |

Maven、测试框架和日志框架明确不作为独立知识方向。Spring 或其他练习需要构建配置时只给最小可运行配置；测试思想和可观测性概念可以在业务主题中按需出现，但不扩展成 JUnit/Mockito 或 Log4j/Logback 独立课程。

## 四、当前方向：Java 数据结构

### 1. 固定规模

- 27 个知识点：Map 9、Set 4、List 4、Queue 2、公共基础 3、并发集合 5；
- 其中 ID 以 `-source` 结尾的源码型知识点正好 9 个，已包含在 27 个知识点内；
- 6 个分类闯关、1 个综合项目、1 个方向终验；
- 合计 **35 节标准课 = 27 + 6 + 1 + 1**，不存在额外的 9 节源码课。

### 2. 35 节标准课

| # | 稳定 ID | 分类 | 源码型 | 学习与验收目标 |
|---:|---|---|:---:|---|
| 1 | `ds.map.contract` | Map 1/9 | 否 | 解释键值映射、`put/get/remove/containsKey` 契约以及 `null` 歧义 |
| 2 | `ds.map.equality` | Map 2/9 | 否 | 用 `equals/hashCode` 契约分析相等键、碰撞与可变键风险 |
| 3 | `ds.map.hashmap-structure` | Map 3/9 | 否 | 推演容量、阈值、负载因子、桶、节点、`size` 与 `modCount` |
| 4 | `ds.map.hashmap-put-get-remove-source` | Map 4/9 | 是 | 从 Java 21 源码跟踪 `put/get/remove` 的定位、替换与碰撞分支 |
| 5 | `ds.map.hashmap-resize-treeify-iterator-source` | Map 5/9 | 是 | 跟踪扩容拆桶、树化/退化和迭代器 fail-fast 主链 |
| 6 | `ds.map.compute-merge-views` | Map 6/9 | 否 | 正确使用 `compute/merge` 与 `keySet/values/entrySet` 活视图 |
| 7 | `ds.map.linkedhashmap-source` | Map 7/9 | 是 | 从源码解释插入顺序、访问顺序、双向链与淘汰扩展点 |
| 8 | `ds.map.treemap-source` | Map 8/9 | 是 | 从源码解释比较、红黑树导航、范围视图及相等性边界 |
| 9 | `ds.map.specialized` | Map 9/9 | 否 | 按枚举键、弱引用键、身份语义等边界选择专用 Map |
| 10 | `challenge.map` | Map 闯关 1/6 | 否 | 在陌生业务中综合验证 Map 契约、源码推演、复杂度和选型 |
| 11 | `ds.set.contract-algebra` | Set 1/4 | 否 | 解释唯一性、成员关系以及交并差等集合代数 |
| 12 | `ds.set.hash-linked-source` | Set 2/4 | 是 | 从源码解释 `HashSet/LinkedHashSet` 对 Map 的委托与顺序 |
| 13 | `ds.set.tree-navigable` | Set 3/4 | 否 | 使用排序、范围和导航操作并识别比较器一致性风险 |
| 14 | `ds.set.enum-boundary` | Set 4/4 | 否 | 判断 `EnumSet` 的位向量收益、类型边界与适用场景 |
| 15 | `challenge.set` | Set 闯关 2/6 | 否 | 综合验证唯一性、顺序、排序、集合代数和复杂度 |
| 16 | `ds.list.contract-arraylist` | List 1/4 | 否 | 掌握 List 契约、随机访问与 ArrayList/其他实现的选型边界 |
| 17 | `ds.list.arraylist-source` | List 2/4 | 是 | 从源码跟踪追加、容量增长、中间插删和数组移动 |
| 18 | `ds.list.linkedlist-deque-boundary` | List 3/4 | 否 | 解释节点定位成本以及 LinkedList 作为 List/Deque 的边界 |
| 19 | `ds.list.iterator-views-copy` | List 4/4 | 否 | 区分迭代器、子视图、不可变集合、只读包装和防御性复制 |
| 20 | `challenge.list` | List 闯关 3/6 | 否 | 综合验证索引、增长、节点、视图、复制与复杂度 |
| 21 | `ds.queue.deque-arraydeque-source` | Queue 1/2 | 是 | 从源码推演 ArrayDeque 的 FIFO/栈语义、环形下标与扩容 |
| 22 | `ds.queue.priorityqueue-source` | Queue 2/2 | 是 | 从源码跟踪二叉堆 `offer/poll`、上浮/下沉和 Top K |
| 23 | `challenge.queue` | Queue 闯关 4/6 | 否 | 综合验证双端队列、优先队列、状态变化和业务选型 |
| 24 | `ds.shared.hierarchy-sequenced` | 公共 1/3 | 否 | 建立集合接口层次与 Java 21 `SequencedCollection` 心智模型 |
| 25 | `ds.shared.ownership-immutability` | 公共 2/3 | 否 | 解释所有权、别名、浅层不可变、防御性复制和快照 |
| 26 | `ds.shared.performance-capacity` | 公共 3/3 | 否 | 从数据规模、时间/空间复杂度、容量和业务语义完成选型 |
| 27 | `challenge.shared` | 公共闯关 5/6 | 否 | 跨 Map/Set/List/Queue 验证层次、所有权与性能推理 |
| 28 | `ds.concurrent.foundation-wrappers` | 并发 1/5 | 否 | 区分线程封闭、不可变共享、同步包装和并发容器 |
| 29 | `ds.concurrent.concurrenthashmap-atomic-api` | 并发 2/5 | 否 | 使用 `compute/merge/putIfAbsent` 并识别复合动作原子边界 |
| 30 | `ds.concurrent.concurrenthashmap-source` | 并发 3/5 | 是 | 从源码定位空桶 CAS、桶级协调、扩容协助与计数入口 |
| 31 | `ds.concurrent.copyonwrite-skiplist` | 并发 4/5 | 否 | 权衡复制写快照与并发有序结构的读取、写放大和一致性 |
| 32 | `ds.concurrent.concurrent-queues` | 并发 5/5 | 否 | 用并发/阻塞队列表达生产消费、容量、等待和背压 |
| 33 | `challenge.concurrent` | 并发闯关 6/6 | 否 | 综合验证共享更新、原子组合、快照、有序结构与背压 |
| 34 | `capstone.java-data-structures` | 综合项目 | 否 | 构建可解释的后端事件索引，覆盖去重、聚合、顺序、Top K 与并发边界 |
| 35 | `final.java-data-structures` | 方向终验 | 否 | 在全新数据与约束中完成选型、推演、Java 21 编码、源码定位和风险说明 |

### 3. 9 个源码型知识点与官方入口

以下 9 项就是上表 27 个知识点中 ID 以 `-source` 结尾的项目，不另增课次。每项固定采用“问题 → 入口类/方法 → 关键字段 → 主调用链 → 扩展点 → 调试练习”，不逐行通读。

| 稳定 ID | OpenJDK `jdk-21+35` 官方源码 | 最小完成证据 |
|---|---|---|
| `ds.map.hashmap-put-get-remove-source` | [`HashMap.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/HashMap.java) | 能定位 `put/get/remove` 入口并推演空桶、碰撞、替换和删除链接 |
| `ds.map.hashmap-resize-treeify-iterator-source` | [`HashMap.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/HashMap.java) | 能推演低/高链拆桶、树化容量门槛和 `modCount` 检查 |
| `ds.map.linkedhashmap-source` | [`LinkedHashMap.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/LinkedHashMap.java) | 能跟踪节点链接、访问后移动及 `removeEldestEntry` 扩展点 |
| `ds.map.treemap-source` | [`TreeMap.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/TreeMap.java) | 能跟踪比较定位、旋转修复和范围视图边界 |
| `ds.set.hash-linked-source` | [`HashSet.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/HashSet.java)、[`LinkedHashSet.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/LinkedHashSet.java) | 能解释占位值、Map 委托与顺序来源 |
| `ds.list.arraylist-source` | [`ArrayList.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/ArrayList.java) | 能跟踪追加、扩容、数组复制和结构修改计数 |
| `ds.queue.deque-arraydeque-source` | [`ArrayDeque.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/ArrayDeque.java) | 能手推头尾下标、环绕、扩容和双端操作 |
| `ds.queue.priorityqueue-source` | [`PriorityQueue.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/PriorityQueue.java) | 能手推上浮/下沉并解释遍历为何不是排序结果 |
| `ds.concurrent.concurrenthashmap-source` | [`ConcurrentHashMap.java`](https://github.com/openjdk/jdk/blob/jdk-21%2B35/src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java) | 能定位空桶 CAS、桶首协调、转发表和计数入口 |

### 4. 六个闯关、综合项目与终验

| 稳定 ID | 覆盖范围 | 必做证据 | 主要红线 |
|---|---|---|---|
| `challenge.map` | Map 9 项 | 数值推演、API 分析、源码分支、业务选型 | 可变键、顺序误判、阈值误判 |
| `challenge.set` | Set 4 项 | 集合代数、去重保序、排序一致性、复杂度 | 平方级去重、比较器不一致 |
| `challenge.list` | List 4 项 | 容量与节点状态、视图和不可变结果设计 | “插入永远 O(1)”、暴露可变视图 |
| `challenge.queue` | Queue 2 项 | Top K、双端队列、堆与环形状态推演 | 把遍历当排序、忽略空队列边界 |
| `challenge.shared` | 公共 3 项 | 接口层次、所有权与跨集合性能分析 | 把只读包装当深不可变 |
| `challenge.concurrent` | 并发 5 项 | 原子组合、快照成本、有序结构与背压方案 | 普通集合共享写、伪原子组合 |
| `capstone.java-data-structures` | 27 项全方向 | Java 21 可运行实现、复杂度报告、失败场景说明 | 结果错误、不能编译、并发边界虚假 |
| `final.java-data-structures` | 迁移能力 | 新数据、新约束、闭卷设计、源码定位与复盘 | 总分低于 80 或任何红线 |

综合项目建议使用后端事件索引场景，同时包含请求幂等去重、按键聚合、失败顺序、最近事件窗口、Top K、不可变结果快照和明确的并发写边界。终验必须更换数据与约束，不能复用综合项目答案。

## 五、Java 21 官方资料

- [Java 21 Collections Framework 概览](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/doc-files/coll-overview.html)
- [Java 21 `SequencedCollection`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/SequencedCollection.html)
- [Java 21 `Map`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Map.html)
- [Java 21 `Set`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Set.html)
- [Java 21 `List`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/List.html)
- [Java 21 `Queue`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/Queue.html)
- [Java 21 `ConcurrentMap`](https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/concurrent/ConcurrentMap.html)
- [OpenJDK 21 GA 源码标签 `jdk-21+35`](https://github.com/openjdk/jdk/tree/jdk-21%2B35)

## 六、大大的个人笔记（自动任务禁止修改）

> 可以在此处自由记录跨日总结、疑问、类比和方向选择理由。自动任务只能更新上方唯一标记区，必须保留本节及其他标记外内容。
