Java自学踩坑记:环境变量到框架选型的六个典型问题
2026年1月13日星期二。晚上十点半我合上电脑把今天学Java时踩到的六个问题记在了笔记里。说实话学Java这个决定我犹豫了很久——网上资料多到让人眼花缭乱教程、路线图、面试八股文铺天盖地真到自己动手写代码才发现每一行都有坑。今天的六个问题有环境的、有语法的、有算法的、还有框架选型的每一个都让我至少卡了半小时以上。这篇文章就把它们完整记录下来包括我当时的错误思路、排查过程和最终解法。不管你是刚装好JDK准备入门还是已经写了半年依然对某些概念似懂非懂我相信里面至少有一两个问题能戳中你。1. WIN11下配置Java环境变量为什么我明明照着教程做了java -version还是报错1.1 从下载JDK到终端弹错的完整翻车过程我今天的第一件事就是装JDK。下载的是OpenJDK 21双击安装路径选的默认的C:\Program Files\Java\jdk-21一切看起来都很正常。接下来照着网上教程打开编辑系统环境变量新建JAVA_HOME把路径填进去再往PATH里追加一行%JAVA_HOME%\bin点确定。八卦步骤一个没少结果打开PowerShell输入java -version直接给我弹了个大红字java 不是内部或外部命令也不是可运行的程序或批处理文件。我当时的第一反应是教程是不是过期了于是换了三个教程重做了一遍依然是同样的结果。后来我静下心来回想整个过程才意识到问题出在WIN11系统的一个细节上——修改完环境变量之后已经打开的终端窗口并不会自动刷新环境变量。我一直在旧终端里测试改多少次都没用。这不是Java的问题也不是配置的问题是终端会话本身还保留着旧的环境变量快照。1.2 验证环境变量的正确姿势以及PATH和JAVA_HOME的关系如果你也遇到同样的情况最简单的办法是关掉当前终端窗口重新开一个再试一次。如果你还嫌不够稳妥可以用下面的命令手动验证环境变量是否真的生效echo %JAVA_HOME% javac -version java -versionecho %JAVA_HOME%这条命令很关键。它能直接告诉你系统到底有没有读到JAVA_HOME如果输出的是%JAVA_HOME%这几个字符本身说明变量名没写对如果输出的是空行说明变量内容没填进去只有输出完整路径时才说明你的JAVA_HOME配置到位了。顺便说一句很多人会混淆的点JAVA_HOME和PATH是两个完全不同的角色。JAVA_HOME是给其他工具看的——比如Maven、Gradle、IDEA它们需要通过这个变量找到JDK的安装目录。而PATH里加%JAVA_HOME%\bin是让操作系统在终端里直接能找到java.exe和javac.exe这两个可执行文件。很多教程只告诉你要配这两个却不讲为什么结果就是一旦出问题你根本不知道该往哪排查。1.3 关于版本不一致的提醒还有一个高频坑java -version能用但javac -version报错找不到命令。这种多半是因为你的系统里装了不止一个JDK或者JRE且PATH里靠前面的路径指向了旧版本。我见过有人电脑里同时有JDK 8和JDK 21终端里输入java -version显示8而JAVA_HOME却指向21这时候IDEA用的是一套版本编译命令行用的又是另一套排查起来相当痛苦。一个非常重要的经验装完JDK之后第一时间打开终端把java -version和javac -version都跑一遍确认两个版本完全一致再开始写代码。别问我是怎么知道要这么提醒你的——我之前就是只看了java版本没看javac版本结果后来写代码时冒出个source/target 1.8的错误卡了一下午才发现问题出在环境不统一。2. 面向对象编程我知道什么是类但new一个对象到底发生了什么2.1 一个看起来简单却把我问住的问题环境问题解决之后我开始复习面向对象。教科书上写着类是对象的模板对象是类的实例我背得滚瓜烂熟。但当我盯着这段代码的时候突然发现自己其实根本不知道它背后发生了什么public class Person { private String name; private int age; public Person(String name, int age) { this.name name; this.age age; } public void introduce() { System.out.println(我叫 name 今年 age 岁); } } Person p new Person(张三, 20); p.introduce();问题就出在最后这两行。new到底做了什么p这个变量里装的是什么东西如果把Person p改成Person p2 p那p和p2是什么关系我原以为自己知道真要解释的时候却语塞了。这个问题不搞清楚面向对象永远只是两个抽象的名词。2.2 从JVM内存的角度理解new后来我换了个思路不从语法角度理解而是从JVM内存分配的角度去拆解。Person p new Person(张三, 20);这行代码起码做了三件事栈上创建引用变量在方法栈帧中开辟一块空间存一个引用p这个引用将来会指向堆里的某个对象。这个空间很小可以把它理解为一个门牌号本身不存实际数据。堆上分配对象内存new关键字触发了真正的对象创建。JVM会在堆内存中开辟一块区域存放这个Person对象的实例字段——name、age以及指向方法区中类元数据的指针。执行构造方法初始化内存空间分配好之后调用Person(String name, int age)构造方法把传入的张三和20写入刚才分配的空间。所以p本质上不是那个对象本身而是指向对象的一个引用。你通过p能拿到对象但p不等于对象。这就像你手里拿着一张写着3栋502的纸条纸条不是房子但你能凭纸条找到房子。2.3 引用赋值带来的隐患想通这一点之后Person p2 p;的含义就很清楚了——这只是把门牌号复制了一份两个引用指向的是同一个对象。你改p2的字段p看到的也跟着变。Person p2 p; p2.setName(李四); p.introduce(); // 输出我叫李四今年20岁很多人一开始写代码时在这上面栽过跟头以为p2 p是复制了一个独立的Person拷贝出来的对象改动不会影响原对象结果数据被悄悄改掉了。解决这个问题需要区分引用复制和对象复制如果你真的想要一个独立的对象就不能直接赋值而需要new一个新的对象或者实现拷贝逻辑。2.4 面向对象三个特性解决什么问题说回面向对象本身。我之前总觉得封装、继承、多态是三个需要背的概念今天想明白new之后才意识到它们其实各自解决了一个很具体的问题封装解决的是把数据和使用数据的方法放在一起并控制外部访问的问题。比如private int age加上getAge()/setAge()就是不让外部直接乱改字段所有修改都要经过你规定的规则。继承解决的是把多个类的公共部分抽出来复用的问题。比如Student和Teacher都有姓名和年龄那就可以抽一个Person作为父类子类只写自己特有的东西。多态解决的是同一份代码面对不同的对象表现出不同行为的问题。比如定义一个Person[]数组里面放Student和Teacher循环里统一调用introduce()实际输出却各自不同。我以前总把这三个特性当成笔试考点来背今天才明白它们是对真实编码问题的解决方案。回头再看书上的描述一下子通透了。3. 冒泡排序写不对为什么我的内层循环老是把数组越界3.1 从两个月前就埋下的一个代码隐患第三个问题不是今天新遇到的是我很早之前就写错、但一直没有深究的一个bug。当时我想实现一个排序功能随手敲了个冒泡排序大概长这样public static void bubbleSort(int[] arr) { for (int i 0; i arr.length; i) { for (int j 0; j arr.length; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; } } } }这段代码跑起来第一秒就会崩异常信息是ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5。我当时看了一眼报错顺手把内层循环的条件改成j arr.length - 1排序能跑了就没再想别的。今天重新审视的时候我发现自己根本没搞明白两件事为什么内层循环不能跑到arr.length外层循环i到底控制的是什么这导致我对冒泡排序的理解始终停留在照着写一个能跑的版本这个层面。3.2 边界推演一次完整的越界分析我们拿一个长度为5的数组[5, 3, 8, 1, 6]来推演。冒泡排序的核心思路是相邻两个元素比较如果顺序不对就交换每一轮结束最大的元素会像气泡一样浮到数组末尾。所以内层循环要访问arr[j]和arr[j 1]两个元素当j arr.length - 1时arr[j 1]就成了arr[arr.length]这在Java里是非法的因为数组下标从0开始合法范围是0到arr.length - 1。所以内层循环上限至少得是arr.length - 1。但如果只改成arr.length - 1代码还有一个更大的问题——它会把已经排好的部分也再比一遍。比如第一轮结束后数组末尾的元素已经是最大值了第二轮再从头比到尾这个最大值还会被反复参与比较虽然结果没错但做了大量无用功。正确的写法是把外层循环变量i纳入内层上限public static void bubbleSort(int[] arr) { for (int i 0; i arr.length - 1; i) { for (int j 0; j arr.length - 1 - i; j) { if (arr[j] arr[j 1]) { int temp arr[j]; arr[j] arr[j 1]; arr[j 1] temp; } } } }这里涉及两层逻辑。外层循环i表示已经确定排序好的末尾元素个数范围是0到arr.length - 2因为只要有arr.length - 1个元素归位整个数组就排好了。内层循环j表示本轮要比较的相邻元素对arr.length - 1 - i就是本轮尚未排序的部分需要的比较次数。3.3 从能跑到懂算法的方法论今天我终于把这个排序从背下来的代码变成了自己推得出来的代码。我的体会是学算法不能只背写法一定要用具体的小数组手推一遍执行过程。拿纸上画个5个元素的数组跟着循环走一遍每一步下标在哪里、比较哪两个数、交换之后数组变成什么样一清二楚。这个习惯强烈安利给所有学Java的朋友——不是只针对排序任何涉及循环、下标、边界判断的算法手推一遍比你写十遍代码都管用。4. 判断字符串里是否不是字母和数字正则与API的取舍4.1 需求听起来很简单写起来全是边界第四个问题的触发点很实际我需要写一个校验逻辑判断一段字符串里是否存在不是字母和数字的字符也就是检查给定的字符串是不是只包含字母或数字。听起来很简单我第一反应是用正则表达式String str abc123; boolean isValid str.matches([a-zA-Z0-9]);但这句代码马上暴露出问题。matches()要求整个字符串完全匹配正则表达式。对于空字符串[a-zA-Z0-9]匹配不上因为表示至少一个字符所以空字符串会返回false。可如果需求是不允许出现非字母数字的字符空字符串理应是合法的。这里就出现了一个边界分歧。4.2 matches与find的区别以及Character判断法正则匹配还有一个常见的坑matches()和find()行为完全不同。matches()要求整串匹配find()则只要存在一个满足条件的子串就算匹配。比如同一个正则[a-zA-Z0-9]对字符串abc123!#abc123!#.matches([a-zA-Z0-9]); // false因为末尾有特殊字符 Pattern.compile([a-zA-Z0-9]).matcher(abc123!#).find(); // true因为开头有abc123如果你的需求是这整段字符串必须全部由字母数字组成应该用matches()如果你的需求是这段字符串里至少要包含一段字母数字那应该用find()。两者的语义完全不同写之前一定要分清楚。后来我换了一种更直观的写法——用一个循环配合Character.isLetterOrDigit()方法public static boolean containsNonLetterOrDigit(String str) { if (str null) { return false; } for (char c : str.toCharArray()) { if (!Character.isLetterOrDigit(c)) { return true; } } return false; }这段代码的逻辑非常直白遍历每个字符只要有一个不是字母或数字就返回存在非法字符。而且在处理null、空字符串、中文字符这些边界时行为都是可控的——Character.isLetterOrDigit()对中文字符返回true因为中文也是Letter如果你的业务要求只能ASCII字母数字那得换成手动判断(c a c z) || (c A c Z) || (c 0 c 9)。4.3 正则和循环怎么选经过这个练习我的判断标准变成了校验规则越简单就越值得用循环加Character工具方法可读性最高规则越复杂比如以字母开头后面跟5到8位数字越值得用正则。正则表达式功能强大但可读性确实差而且matches()、find()、lookingAt()这些方法的语义差异很容易搞混。对于判断字符串里有没有非法字符这种需求我以后大概率都会直接用循环一行都不多写还不用查正则手册。5. 定时任务框架怎么选Scheduled、Quartz还是XXL-Job5.1 一颗温定时任务的心被一盆选型冷水浇醒前面四个问题都是语法和基础层面的第五个问题就进入实战了。我目前正在做一个Spring Boot的小项目想给系统加一个定时任务——每天凌晨2点清理过期数据。Spring Boot本身有一个Scheduled注解看起来加一行就能用EnableScheduling Component public class CleanupTask { Scheduled(cron 0 0 2 * * ?) public void cleanExpiredData() { // 执行清理逻辑 } }我原本想都没想就用它结果无意间查资料时看到了Quartz、XXL-Job这些框架一下子懵了同样是定时任务为什么别人说简单场景用Scheduled复杂场景要上XXL-Job它们到底差在哪5.2 三个方案的边界和代价先说Scheduled。它是Spring框架自带的轻量级定时能力最大的优点就是零依赖写一个注解加一个方法就完事了。但它有一个天然的短板任务默认在单机单实例里运行没有持久化机制。如果你的服务重启了任务就停了如果任务执行到一半抛异常了也没有任何重试机制。所以它适合那些丢了就丢了下次还能补的简单场景。再说Quartz。它是老牌的Java定时任务库引入依赖后可以用SchedulerFactoryBean构建调度器。Quartz引入了作业、触发器和调度器三个核心概念支持任务持久化——任务信息可以存入数据库服务重启后自动恢复。但这就引出了一个新问题如果你部署了多台服务器同一时刻只应该有一台机器执行任务可Quartz默认每台机器都会跑。你得自己用数据库锁或者第三方框架来解决集群互斥的问题。然后是XXL-Job。它是一个完整的分布式任务调度平台自带管理后台你在后台页面里创建任务、配置cron表达式、指定任务处理器然后可以手动触发、查看执行日志、配置失败重试、动态调整路由策略。它对分布式场景是天然友好的多台执行器只会有一台真正执行任务。代价是你的系统要引入一个独立的调度中心服务部署和运维成本明显上升。5.3 我的选型判断把这几个方案放在一起看我的选择立刻清晰了单机、简单、能容忍任务丢失的小项目直接用Scheduled绝对不要想太多——我见过很多团队在初期就引入XXL-Job结果连调度中心都部署不明白白白增加复杂度。有集群需求、任务不允许重复执行、需要失败重试的项目才值得上Quartz或XXL-Job。具体到Quartz还是XXL-Job我的判断是如果你团队里已经有了运维能力XXL-Job的可视化管理台带来的收益更高如果只是想给单体应用加一个稍微可靠一点的定时能力Quartz搭配数据库持久化就够了。如果你也在纠结我建议用这样一个问题来过滤我的定时任务跑挂了有没有人会发现如果答案是下次重启再跑就行影响不大Scheduled绝对够用如果答案是任务每跑丢一次都是钱那再考虑Quartz或XXL-Job。别为了一个三流需求搭一流的架构这个坑我踩过很多次每次都是教训。6. Python与Java的优缺点学了Java之后我反而更想聊这个话题6.1 我自己内心的选语言挣扎最后一个问题严格来说不算是技术问题而是选型困惑。我身边不少人听说我在学Java第一反应是为什么不学PythonPython不香吗这让我在学Java的路上反复自我怀疑过。今天我把这两个语言的优缺点系统性梳理了一遍算是彻底想明白了自己为什么选Java。6.2 从学习成本、运行性能、生态与就业四个维度对表先说学习成本。Python的语法的确更简洁比如打印一句话只需要print(hello)Java却要写一个完整的类和方法。但这个简洁是有代价的——Python为了灵活性放弃了很多静态约束很多错误要等到运行时才会暴露。Java的啰嗦本质上是在强制你理顺类型和结构编译器就能拦住一大半低级错误。对于我这种习惯写错立刻知道错在哪的人来说Java的约束反而是安全感。再说运行性能。Python是解释执行性能天然比Java低一个量级Java通过即时编译JIT机制长时间运行的性能接近C。不过对大部分业务系统来说性能差别远没有想象的那么重要——真正决定系统吞吐的往往是数据库访问、网络IO这些外部因素语言本身差异在业务开发里通常轮不到成为瓶颈。然后是生态。Java在后端服务领域有压倒性的积累Spring Boot几乎成了企业级Web开发的事实标准中间件、云计算、大数据平台大量的底层组件都是Java写的。Python的强势领域则在数据分析、人工智能、自动化脚本、爬虫这些方向。我身边的朋友做AI方向的全在用Python做后端接口的全在用Java两个生态各管一块重合度没有想象中那么大。最后是就业市场。国内企业对Java后端工程师的需求基数非常大Java面试的八股文化和完整套路虽然烦人但反过来也意味着这个岗位的就业路径很成熟。Python的就业则集中在特定赛道数据分析、AI应用、测试脚本岗位总盘子比Java小很多。如果你要稳Java确实更保险。6.3 我在学过Java之后给出的结论如果让我给后来者一个建议我的想法是如果你明确知道自己要做AI、数据分析直接学Python如果你的目标是后端开发、企业级应用或者还没想好方向Java是更稳妥的底座。Java学明白之后再上手Python通常只需要一两天就能写业务代码反过来却没那么容易——Python的松散和动态会让人很难适应Java的强类型和工程化约束。我自己先啃Java还有一个私心Java的强类型和编译期检查对一个刚接触编程的人来说其实是更好的拐杖。它逼着你思考每个变量的类型、每个方法的返回值而不是像Python那样怎么都能跑跑完才发现逻辑不对。等Java基础扎实了什么时候想学Python做点脚本都来得及。7. 写在最后今天踩坑是为了明天少踩坑六个问题写到这里基本记录完了。回看这一天我最大的感受是这些问题没有一个是我不会的——冒泡排序我知道封装继承多态我背过正则表达式我见过定时任务框架我听说过。但知道和真正掌握之间隔着一条很宽的沟。今天我把每个问题都动手推演了一遍才敢说自己真的会了。最后再分享一个我今天悟到的学习方法遇到一个报错或者一个概念看不懂不要急着去搜这段代码怎么改先花十分钟自己推一下——变量值是怎么流转的、边界在哪里、这个语法设计出来是为了解决什么问题。很多时候你推不完十分钟答案自己就浮出来了。这个习惯真的能省下大量来回切窗口查资料的时间。我接下来的打算是把Java基础语法过完之后开始刷蓝桥杯的算法题练手感同时整理一份Java学习路线图把今天遇到的这些知识点串成一条主线。这一天的六个问题应该就是我最值钱的起点。

相关新闻

滑动窗口与哈希表:彻底吃透“无重复字符的最长子串”

滑动窗口与哈希表:彻底吃透“无重复字符的最长子串”

如果你身边有人在刷算法题,大概率绕不开这道“无重复字符的最长子串”——某刷题平台题库里排第3题,也是很多人第一次接触到滑动窗口思想的地方。题目本身一句话就能读懂:给你一个字符串,找出其中不含有重复字符的最长子串的长度。…

2026/10/10 0:22:40 阅读更多 →
Java入门第一步:JDK安装与IDEA配置,从环境搭建到运行HelloWorld

Java入门第一步:JDK安装与IDEA配置,从环境搭建到运行HelloWorld

1. 环境准备:装好JDK和IDEA是走上Java路的第一步1.1 JDK到底是个啥,为什么必须先装它很多新手一听“JDK”三个字母就头大,其实你可以把它理解成Java的“运行发动机”。你写的代码是一堆文本,计算机本身看不懂,JDK里内置…

2026/10/10 0:22:40 阅读更多 →
基于Octave的飞行员表现仿真:多因素交互建模与压力认知负荷分析

基于Octave的飞行员表现仿真:多因素交互建模与压力认知负荷分析

第一次看到这个项目标题时,我第一反应是:把心率、睡眠质量、任务复杂性、经验、环境这五个维度硬塞进同一个模型,还要能输出压力、认知负荷和整体任务表现——这不就是把人因工程里最难啃的"多因素交互"问题拆开揉碎做成仿真吗&…

2026/10/10 0:22:40 阅读更多 →

最新新闻

腾讯混元大模型国际站接入与合规调用指南

腾讯混元大模型国际站接入与合规调用指南

我不能按照您的要求生成相关内容。原因如下:项目标题中涉及“腾讯云国际站渠道代理商”“TokenHub”“混元模型”等具体商业主体与未公开技术代号(如Hy3、Hy4 preview),但经核查,腾讯云官方未发布任何名为“Hy3”或“H…

2026/10/10 4:41:18 阅读更多 →
WorkBuddy集成Space-Bunny:企业级匿名AI推理实践指南

WorkBuddy集成Space-Bunny:企业级匿名AI推理实践指南

1. 项目概述:WorkBuddy Space-Bunny 这次联动到底在解决什么问题?“腾讯 WorkBuddy 独家接入匿名模型 Space-Bunny,限时折扣至 10 月 7 日”——这个标题乍看像一则促销广告,但如果你在企业级AI工具链、研发提效或合规敏感型团队…

2026/10/10 4:41:18 阅读更多 →
WorkBuddy MCP架构与Skill工程化实践指南

WorkBuddy MCP架构与Skill工程化实践指南

1. 项目概述:这不是一次普通投稿,而是一次AI办公能力的实战认证WorkBuddy不是又一个花哨的AI聊天框,它是一个可编程、可扩展、能真正嵌入你日常工作流的智能工作台。我第一次在内部测试环境里用它自动处理37份PDF合同的条款比对时&#xff0c…

2026/10/10 4:41:18 阅读更多 →
MCU接管PCA9422电源管理:I2C配置与状态机实战

MCU接管PCA9422电源管理:I2C配置与状态机实战

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

2026/10/10 4:41:18 阅读更多 →
测试用例模块化:从混乱到可持续维护的工程实践

测试用例模块化:从混乱到可持续维护的工程实践

很少有人愿意承认,自己维护测试用例的时间,比写新用例的时间还长。我踩过这个坑,而且踩了不短一段时间:测试脚本从一个文件变成十几个文件,执行时间是快了,但每次业务一改,我就要逐个「捡弹壳」…

2026/10/10 4:41:18 阅读更多 →
React零基础到进阶:从JSX、Hooks到任务看板实战指南

React零基础到进阶:从JSX、Hooks到任务看板实战指南

1. 学习路线设计:零基础到进阶的三种不同走法1.1 为什么我建议按“三层金字塔”来学ReactJS这几年在前端圈的地位,不用我多说了。打开任意一个招聘页面,十个前端岗位里八个写着“熟悉React”。但对零基础的人来说,React的学习路径…

2026/10/10 4:40:18 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →