Java OCP认证备考:从代码题到Stream、并发和模块化的实战攻略
简介面向备战Oracle Java SE 11开发人员认证1Z0-819的开发者这份轻量级示例项目资源以实际代码演示var局部变量类型推断、Stream API扩展、Map接口改进、异常处理与并发编程等认证核心知识点。压缩包共22个文件包含8个Java源码、8个properties配置以及.project、.classpath、README.md、LICENSE、.gitignore等工程文件整体仅24KB结构十分紧凑源码、配置与工程描述文件分工明确。从内容预览看资源内含完整的ProductManagement工程src与bin目录提供源码和编译产物可直接导入IDE运行配合README能快速了解模块划分properties文件有助于观察Java 11中的资源配置写法。包体虽小但覆盖了从编码到构建、从许可证到版本控制的完整工程视图适合作为考前快速回顾的轻量案例尤其适合在通勤或碎片时间动手查看。已有294人学习下载对于希望把OCP考点落到代码层面的中级Java开发者能起到查漏补缺的作用。1. Java OCP认证专家不是背题库而是真正会写代码Java OCP认证专家这套资源我第一次翻完就意识到它和网上那些“只刷题”的包不一样它给了你一套能把考试和能力同步抬升的路径。很多人挂在OCP上不是因为Java语法难而是因为现在机考里代码分析题占比很高纯靠背选择题已经翻车。这套资源的价值在于把考点拆成了“知识点理解 代码题练手 错题复盘”三段尤其适合有1-2年Java开发经验、想用一张证书证明实战能力的从业者。下面我会按我拆包的顺序讲清楚里面每一块怎么用、参数怎么调、坑在哪里。2. 认清Java OCP认证的考核范围资源里到底有什么拿到资源压缩包之后我先做了两件事扫目录、看版本说明。这个包不是简单的PDF合集而是围绕新版Java SE考试大纲整理的完整练习系统。很多人误以为OCP就是“选择题过关”实际上考试题目里大量出现“给定一段代码问哪行会编译错误”“分析stream管道输出什么”这种题型光看不练完全没用。2.1 资源包的目录从考试大纲到机考题库解压后的结构通常是下面这样我自己的习惯是先读README和exam_topics下的主大纲再打开labs目录练手java-ocp/ ├── README.md # 版本说明、适用JDK、学习顺序 ├── exam_topics/ │ ├── core_java.md # 核心Java考点清单 │ └── advanced_java.md # 并发、NIO、模块化等进阶清单 ├── labs/ │ ├── stream/ # 函数式编程实验代码 │ ├── concurrency/ # 并发与同步实验 │ ├── module/ # 模块化Demo │ └── build.sh # 一键编译运行脚本 ├── mock_exam/ │ ├── mock_1/ # 第一套模拟题含代码题 │ ├── mock_2/ │ └── answers/ # 答案与解析 └── review_tools/ └── topic_checker.py # 知识点自检脚本这套组织逻辑是有讲究的exam_topics让你建立“要考什么的”地图labs让你把知识变成肌肉记忆mock_exam让你校准做题节奏。review_tools里那个topic_checker.py是很实用的东西后面第四章我会专门讲怎么改它做自测。2.2 搭建练习环境JDK、命令行与IDE的取舍练代码题环境配错会浪费大量时间。我一般推荐用命令行编译运行因为OCP机考环境没有IDE的自动补全和自动导入。第一步先确认本机JDK版本java -version javac -version输出里有“17”之类的版本号即可。如果javac提示找不到命令说明只装了JRE没装JDK。日常开发中常见做法是下载一个开源JDK发行版把JAVA_HOME指到解压目录再把bin路径加进PATH。注意JAVA_HOME不要指到jre目录否则编译会报找不到javacexport JAVA_HOME/usr/local/jdk-17 export PATH$JAVA_HOME/bin:$PATH这段配置有两点要说明第一如果使用zsh或bash要把这两行写进.zshrc或.bashrc否则每次开新终端都要手动执行。第二验完版本后建议执行一下javac -h快速确认编译工具可用不要等到做代码题才发现在编译环节就翻车。接下来验证环境是否能编译资源里的示例代码。进入labs/stream目录先看build.shcd labs/stream ./build.sh如果脚本没有执行权限用chmod x build.sh加上权限再执行。这个脚本内部做的事情很朴素收集当前目录下所有.java文件逐个用javac编译然后用java运行Main。执行后如果控制台出现运行结果或测试断言通过说明环境没问题。要是电脑同时装了多个JDK确认一下java -version和javac -version的版本号是否一致我见过java是17而javac还是11的情况那会让代码行为变得很诡异。3. 核心考点逐个拆Stream、并发和模块化的练习套路OCP考试最拉分的就是函数式编程、并发和模块化。这三个部分抽象、容易混淆而且机考里经常给出一段有微妙错误的代码。资源里的labs就是为这三个点服务的每个实验的代码量不大但都设计成“先猜输出、再跑结果、最后看解析”。3.1 函数式编程与Stream用代码题掌握求值顺序很多新手第一个坎是“stream是惰性求值”。只看定义没用我建议直接跑一个副作用例子来体会import java.util.stream.*; import java.util.*; public class StreamLazy { public static void main(String[] args) { ListInteger list Arrays.asList(1, 2, 3, 4, 5); var result list.stream() .peek(i - System.out.println(peek: i)) .filter(i - i % 2 0) .map(i - i * 10) .collect(Collectors.toList()); System.out.println(result: result); } }逻辑说明peek是调试用的中间操作观察元素的流动顺序。filter先把偶数留下map再把每个偶数乘以10。实际运行会先输出peek: 1然后peek: 2之后filter通过再peek: 3……这说明stream是逐个元素流过整条管道的不是先遍历完再统一处理。很多人误以为是“先收集所有偶数再map”跑一次这段代码就纠正过来了。参数说明如果你的JDK版本低于9不要用var改成显式写ListInteger result即可。另外collect(Collectors.toList())是常见操作机考答案里还可能用toList()后者是Java 16以后才稳定的API资源里的题目如果没有特殊说明建议优先写Collectors.toList()以避免版本兼容问题。再练习题里经常出现的flatMap题。比如把列表嵌套结构展开ListListInteger grid Arrays.asList( Arrays.asList(1, 2), Arrays.asList(3, 4) ); ListInteger flat grid.stream() .flatMap(List::stream) .map(x - x 1) .collect(Collectors.toList()); System.out.println(flat);逻辑说明flatMap把每一个ListInteger摊平成元素流之后再执行map(x - x 1)。输出是[2, 3, 4, 5]。这里要特别留意flatMap的参数是“把元素变成流”的函数不能直接写map。机考经常会用flatMap和map互换挖坑记住“map返回一个值flatMap返回一个Stream”。3.2 并发与线程安全死锁演示和资源里的排查技巧并发题在OCP里不算多但每套几乎必有一道。重点集中在synchronized、volatile、ConcurrentHashMap和ExecutorService。资源里的labs/concurrency有个死锁小Demo很能锻炼排查能力class Account { int balance; Account(int balance) { this.balance balance; } void transfer(Account target, int amount) { synchronized (this) { synchronized (target) { balance - amount; target.balance amount; } } } }逻辑说明这段代码在同时做“A转账给B”和“B转账给A”时可能死锁。因为两个线程各自先锁自己的账户再等对方的锁互相不放。资源配套的DeadlockDetect.java会把线程栈打出来用下面命令运行jcmd pid Thread.print如果没有jcmd用jstack pid也行。机考不太考这种工具但做实验时你会发现真正理解死锁后题目里“哪个代码能避免死锁”就很容易判断——答案往往是把加锁顺序统一比如按对象哈希值排序。参数说明synchronized锁的是对象监视器不是代码块本身。所以两个synchronized(this)并不代表互斥还要看锁的实例是谁。资源里的注释反复强调“锁的是账户实例”这比背概念管用。3.3 Java模块化为什么报错要看java --list-modules模块化JPMS是OCP里比较劝退的部分。很多人习惯把jar包扔进classpath就完事新版机考却会问“模块描述符里缺了什么”。我按照资源里的labs/module练习时遇到一个典型报错java --module-path out --module com.example.driver如果模块的module-info.java没有正确导出包就会得到Package ... is not visible。这种情况的排查顺序是先用javac --module-path编译再用java --describe-module看模块暴露了什么。java --module-path out --describe-module --module com.example.driver逻辑说明这条命令会打印模块名、依赖、导出的包。如果导出的包列表里没有你访问的那个包说明module-info.java的exports写漏了。资源里给的提示是先写requires再写exports不要调换顺序。参数说明--module-path是模块的搜索路径--module是启动模块。初学者最容易踩的坑是把--module-path写成-classpath那样模块系统不会生效报错会变成ClassNotFoundException误以为是依赖缺失。记住模块化必须一路module-path到底。4. 用模拟题校准答题节奏自测脚本改造成专属检错器只看资料不动手考试绝对会超时。OCP机考通常100分钟70题左右折合到代码分析题上每题不能超过2分钟。资源包里有两套模拟题我建议按照“先做、后改、再二刷”的流程用而不是一遍做完就对答案。4.1 一小时的模拟自测时间怎么分配第一次做模拟题时不要只看正确率要记录每道题的实际耗时。我习惯这样记录纯理论选择题每题不超过45秒单段代码分析题每题不超过90秒多段代码或推断题每题不超过150秒如果某道题超过了160秒做完后标记为“超时题”。超时不是因为你笨而是因为某个API不确定或者对求值顺序不熟。资源里的mock_exam/answers/目录给了按知识点分组的解析把超时题归类后你会发现集中在两三个考点上。4.2 错题复盘流程从答案反推知识点简单对答案没有用。我一般会把做错的题拿出来在exam_topics对应小节里找到明确说法然后自己改代码验证。比如一道关于TreeSet排序的题错了我会在命令行写一个小Demo验证比较器行为import java.util.*; public class TreeSetDemo { public static void main(String[] args) { // 故意用lambda比较器验证排序和equals的关系 SetString set new TreeSet((a, b) - a.length() - b.length()); set.add(java); set.add(ocp); set.add(spring); System.out.println(set); } }逻辑说明TreeSet按比较器去重所以java和ocp长度相同后者会被前者覆盖。很多人以为TreeSet用equals判断重复实际是用比较器返回0代表相等。跑完后把结论写进自己的错题本。参数说明lambda比较器里a.length() - b.length()可能溢出资源里推荐用Comparator.comparingInt(String::length)更安全。机考可能故意挖“减法比较器溢出”的坑所以这里建议你直接用后者练习。4.3 评分脚本把知识点清单改成可勾选的进度表资源里review_tools/topic_checker.py本意是问你“某个知识点是否已掌握”但默认是命令行输入太费时间。我改动成一个文本匹配的校验脚本用来检查自己的笔记里是否包含关键术语import os import re def check_topic(keywords, note_file): with open(note_file, encodingutf-8) as f: content f.read() missing [kw for kw in keywords if kw not in content] return missing # 函数式编程自检keyword必须出现在笔记中 keywords [effectively final, stream pipeline, lazy evaluation, collectors] missing check_topic(keywords, my_notes/java_stream.md) if missing: print(未覆盖:, missing) else: print(函数式编程覆盖完成)逻辑说明check_topic读取你的笔记文件然后逐个检查关键词是否出现。返回值missing是没写过的术语。如果你的笔记里连effectively final都没提到那考试时遇到lambda中变量修改一定吃亏。这个脚本的价值不在于自动化而在于强迫你把每个考点用自己的话写一遍。参数说明encodingutf-8是我加上的不然中文Windows系统会乱码。keywords列表按考试大纲来改不要只依赖我给的这四个。如果你连笔记都没写脚本会提示未覆盖这时就老老实实去补笔记。5. Java OCP备考资源的五个常见问题现象、原因、解决这段是基于我拆这份资源时遇到过的真实翻车经历也参考了其他使用者的反馈。每条都很具体希望你能绕开。5.1 现象直接用旧版题库刷题新版机考正确率暴跌原因OCP考试大纲更新后旧题库里的日期API、模块化题目还在用Java 8写法机考实际代码基于新版本API行为有差异。解决检查资源里的README是否标注“适用于最新版考纲”。我拿到这份包之后先把mock_exam里所有题目的代码段复制到本地编译一遍只要有报错统一用新版语法修正后再理解。这比对着旧答案背更可靠。5.2 现象IDE里运行得好好的代码机考环境编译失败原因IDE会自动引入缺失的import还会把IDE的编译参数带进去机考平台没有这些隐式设置。解决从第一天起就用命令行编译至少每周单独跑一次javac编译所有实验代码。资源里labs/build.sh已经写了编译命令执行前先清空out目录确保没有IDE生成的缓存类文件。5.3 现象lambda表达式里修改循环变量编译直接报错原因lambda只能捕获“effectively final”的局部变量。机考常给一段“for循环里i被lambda使用还要改i”的代码。解决把循环变量复制到lambda外的临时变量再在lambda里使用。例如for (int i 0; i 5; i) { int idx i; // effectively final Runnable r () - System.out.println(idx); }逻辑说明idx在lambda创建之后没有再被赋值所以是effectively final。直接捕获i会制造编译错误这道题机考很喜欢出的。5.4 现象模拟题选择题正确率超过80%考试却被代码填空题难住原因只做了选择题没做资源里labs的代码练习题。选择题只要辨认答案你甚至能靠排除法蒙对。代码填空题需要自己写出完整调用链比如stream().filter(...).map(...).collect(...)少一个.collect就错了。解决二刷模拟题时不要在答案里选而是先把每个空填出来再对照答案。资源里的labs每一个实验都有留空版本在problems子目录里。5.5 现象考试最后十五分钟还有十道题没做心态崩了原因在Stream和Datetime API的多行代码分析题上耗时太长超过单题上限。解决平时做模拟题时强制自己执行“一道题超时2分钟就跳过并标记最后再回来看”。资源里mock_exam没有自动计时器我自己用time命令加在运行命令前每次执行都清楚看到耗时。考试时遵循“先易后难”把明显简单的题一分钟内拿下把复杂代码题留到最后才不会丢大分。6. 最后三天的冲刺技巧用随机抽题脚本替代重复翻书临近考试我不建议再通读一遍知识点而是用“随机抽题 限时作答 错题溯源”来压榨最后的时间。资源里已经有mock_exam两套题我可以把它们拆成单题文本再用一个随机抽取的脚本每天抽5道重点题当考试一样计时。我写了一个简单的bash脚本用来从题集里随机抽题#!/bin/bash question_dir$1 count$2 # 随机抽取count道题并按抽取顺序打印 ls $question_dir/*.txt | shuf -n $count | while read f; do echo $(basename $f) cat $f echo done逻辑说明shuf -n $count从题集文件名里随机选数量再逐个读取内容。参数$1传题集目录$2传抽题数量。我把代码题单独放一个目录因为代码题更需要保持手感和敏感度每天抽5道程序输出题强制自己先写答案再跑代码。参数说明shuf依赖于coreutilsWindows下如果用的是Git Bash通常自带如果是纯MSYS2可能需要额外安装。你还可以在脚本最后加一句sleep 60来模拟每题一分钟的思考时间防止自己偷看答案。这个方法帮我跨过了“背了但考试识别不出来”的坎。自从用过一次之后我每次备考都会提前把题集拆成单题文件用随机抽题脚本保持对陌生脸抽到的反应速度。考试是没有目录可翻的随机应变才是唯一的后悔药。最后让我把这份自己用着顺手的资源整理出来里面包含环境搭建脚本、代码实验、模拟题和这个抽题工具需要的话拿去做一次完整的机考演练。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

多线程与线程池实战:Java多用户Socket通信服务端设计

多线程与线程池实战:Java多用户Socket通信服务端设计

1. 从单用户到多用户:Socket通信的瓶颈到底在哪 很多刚接触网络编程的朋友,第一个能跑通的Demo大概率是"客户端发一句,服务端回一句"的单线程模型。代码不到五十行,跑起来看到控制台打印出对方发来的消息,成…

2026/10/16 12:09:13 阅读更多 →
低光图像增强两大经典:RAW直出与Retinex分解实战解析

低光图像增强两大经典:RAW直出与Retinex分解实战解析

夜景拍出来的照片一团黑、噪点糊成一片,这大概是所有摄影爱好者和做视觉算法的人都绕不过去的坎。我早年在做安防监控图像质量调优的时候,被低照度视频折磨得不行,后来接触到两篇经典工作,一篇是 Learning to See in the Dark&…

2026/10/16 12:09:13 阅读更多 →
同为线性复杂度:VisionHOPE和Mamba系视觉骨干,谁更适合长序列任务

同为线性复杂度:VisionHOPE和Mamba系视觉骨干,谁更适合长序列任务

同为线性复杂度:VisionHOPE和Mamba系视觉骨干,谁更适合长序列任务 【免费下载链接】VisionHOPE 项目地址: https://ai.gitcode.com/hf_mirrors/PSRben/VisionHOPE 自注意力把视觉 token 间的交互变成 O(N),分辨率一旦拉高&#xff0c…

2026/10/16 12:09:13 阅读更多 →

最新新闻

爬虫浏览器CLI:面向 AI Agent和开发者的终端优先网络爬虫2026指南|TaoToken 统一 Key 接入实践

爬虫浏览器CLI:面向 AI Agent和开发者的终端优先网络爬虫2026指南|TaoToken 统一 Key 接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 1:38:25 阅读更多 →
claude-code-memory-setup源码解读:session_autosave.py零LLM调用的SessionEnd Hook实现原理

claude-code-memory-setup源码解读:session_autosave.py零LLM调用的SessionEnd Hook实现原理

【免费下载链接】claude-code-memory-setup Up to 71.5x fewer tokens per session on Claude Code with Obsidian Graphify. Persistent memory, codebase knowledge graphs, and chat import pipeline. 🇧🇷 PT-BR included. 项目地址: ht…

2026/10/17 1:38:25 阅读更多 →
Fider 部署实战:Docker 三步搭好功能请求与反馈投票系统

Fider 部署实战:Docker 三步搭好功能请求与反馈投票系统

Fider 部署实战:Docker 三步搭好功能请求与反馈投票系统 【免费下载链接】fider Open platform to collect and prioritize feedback 项目地址: https://gitcode.com/GitHub_Trending/fi/fider 用户的功能请求散落在工单、应用商店评论和微信群里&#xff0c…

2026/10/17 1:38:25 阅读更多 →
生产级分页工具类设计:page/size/countRows三参数深度管控

生产级分页工具类设计:page/size/countRows三参数深度管控

1. 项目概述:一个真正能落地的分页工具类,不是“Hello World”式Demo“自定义分页工具类:page、size、countRows”——这行标题看起来平平无奇,甚至有点老派。但如果你在一线写过至少三个真实业务系统,就会明白&#x…

2026/10/17 1:38:25 阅读更多 →
Qwen3 小模型 NPU 部署完全指南:如何在端侧设备上快速跑通推理

Qwen3 小模型 NPU 部署完全指南:如何在端侧设备上快速跑通推理

大模型人工智能基础模型 【免费下载链接】Qwen3-1.7B_rai_1.8.0_medusa_1.0_npu 项目地址: https://ai.gitcode.com/hf_mirrors/amd/Qwen3-1.7B_rai_1.8.0_medusa_1.0_npu 点击查看 免费下载 想在手机、平板这类端侧设备上本地运行大模型?Qwen3-1.7B_ra…

2026/10/17 1:38:25 阅读更多 →
无人车实车调试核心:标定、场景泛化与系统降级实战指南

无人车实车调试核心:标定、场景泛化与系统降级实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 1:37:24 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →