Java基础第二阶段:运算符、流程控制、数组与字符串实战指南
很多自学 Java 的朋友学完变量、数据类型、控制台输入输出之后会突然进入一段迷茫期语法似乎都眼熟但真要写个东西出来又不知道该从哪里下手。这个位置恰好就是 java基础-2 要解决的问题。我见过太多人在这里反复翻书、反复看视频进度反而越来越慢原因很简单——不知道该练什么、练到什么程度才算过关。这篇内容就是把基础阶段最容易卡住的几块硬骨头拆开讲清楚运算符、流程控制、数组、字符串、方法以及那些初学必见的报错。每个部分我都会先说它解决什么问题再给代码和思路最后补上实际带人时见到的常见失误。适合刚学完第一阶段的读者也适合基础不牢想回炉巩固的同学。1. 从 Hello World 走出来第二阶段到底该学什么1.1 第一阶段通常覆盖什么第二阶段要补什么大多数入门教程的第一阶段会讲这些JDK 的安装、环境变量配置、Hello World 的运行流程、变量声明、基本数据类型int、double、boolean 等、运算符的简单使用、Scanner 读取用户输入。这套组合拳打完之后你能做的最复杂的程序大概也就是输入两个数求和输入成绩判断是否及格这种级别。但这些其实只是能看懂语法的层面离会写程序还有一段不小的距离。java基础-2 这个阶段要补的是几块从语法走向逻辑的跳板运算符的深水区不只是加减乘除而是整除、取模、自增自减、短路逻辑、三元表达式这些初学最容易写错的地方。流程控制if、switch、for、while让程序根据条件执行不同分支、重复做某件事这是编程逻辑真正开始运转的地方。数组第一个需要建立引用概念的数据结构也是后续集合框架的认知基础。字符串String 对象不可变的特性、 和 equals 的区别这些几乎每个面试题都会碰到。方法把代码拆成积木、封装复用这是程序设计的起点。这一篇不会去碰类、对象、继承这些面向对象概念那不是基础第二课该讲的。先把这些过程式的东西练扎实后面学面向对象才不会被概念和语法的双重负担压垮。1.2 为什么这个学习顺序几乎是固定的有人可能会问为什么非要按这个顺序学先学数组再学循环行不行先学方法再学字符串行不行技术上当然能看懂但学习效率会差很多。原因在于这些知识点之间有明显的依赖关系循环里通常会配合条件判断比如求偶数和、统计个数所以 if 和 for 最好连着学。数组的遍历方式天然就适合用 for 循环不先学循环数组的价值体现不出来。方法里会用到数组和字符串作为参数、返回值放在数组之后讲例子随手就能写。字符串的 equals 问题又涉及 这个运算符的语义理解所以运算符必须早早打好基础。这个顺序不是我发明的是无数条学习路径验证过的。跳着学容易陷入每个字都认识组合起来看不懂的状态老老实实推进反而最快。1.3 先给自己定一个看得见的输出目标学完这一阶段你应该能独立完成类似这样的程序从控制台读取若干个学生的成绩计算平均值、最高分、最低分并输出每个成绩对应的等级优、良、及格、不及格。这个任务虽然简单但它把这一阶段几乎所有知识点都串起来了Scanner 输入、数组存储、循环遍历、分支判断、方法封装。如果你能不看答案写出这个程序并且能解释清楚每一步为什么这么写那 java基础-2 就算真正过关了。2. 运算符与表达式初学阶段最容易写错的一组细节2.1 整除和取模别让 Java 的整数运算给你惊喜先看一个很经典的问题int a 7 / 2; System.out.println(a); // 输出多少很多新手以为会输出 3.5实际输出的是 3。原因很简单两个 int 做除法时Java 不会自动帮你转成浮点数结果还是 int小数部分直接截断。这不是 bug而是整数运算的规则。那要是真想要精确的小数结果怎么办两种办法double b 7.0 / 2; // 有一个操作数是浮点数结果就是浮点数输出 3.5 double c (double) 7 / 2; // 强转之后再除也输出 3.5取模运算符 % 也值得多说一句。它算的是整除后的余数比如 7 % 2 结果是 1。初学阶段最容易搞混的是负数场景-7 % 2 在 Java 里结果是 -1因为 Java 的结果符号跟被除数一致。这个知识点平时用得不多但一旦遇到往往会被折腾一阵。提示如果你要判断一个整数 n 是不是偶数正确写法是 n % 2 0而不是拿 n / 2 再去判断。这个坑看着低级我见不少人真踩过。2.2 自增自减 放在前面和后面完全是两回事自增自减运算符是初学者绕不过去的一个坎原因在于它有两个位置i和i还有两个效果用旧值还是用新值。我的记忆方法很粗暴i先拿去用用完再加。i先加加完再拿去用。看代码int i 3; int m i; // m 3i 变成 4 int n i; // i 先变成 5然后 n 5为什么我要单独拿出来讲因为在 for 循环里i和i对整体的循环结果几乎没影响但在表达式里使用就完全不同。实际开发中除了 for 循环的步进我基本不推荐把自增自减混在复杂表达式里。这种代码写出来很炫但下一次维护的人很可能就是三个月后的你自己读起来真的想骂人。2.3 短路逻辑与三元表达式和||是两个逻辑运算符它们的行为和、|不太一样。关键在于短路两个字int age 10; boolean result (age 5) || (age 20); System.out.println(age); // 猜猜输出是多少因为age 5已经是 true整个||表达式的结果已经确定右边的age 20根本不会执行所以 age 还是 10。同理左边为 false右边就不执行。这个特性在初学阶段好像没啥用但在后面的实际项目里它就是先检查对象是否是 null再访问对象的属性这种保护性语句的地基。三元表达式是 if-else 的简写int score 85; String level score 60 ? 及格 : 不及格;它的结构是条件 ? 结果1 : 结果2适合简单场景。但有个建议如果条件分支里要执行多行逻辑别用三元老老实实写 if-else可读性比那几行代码的简洁重要得多。2.4 运算符优先级记不住就多用括号很多人会去背优先级表什么算术运算符大于关系运算符大于逻辑运算符之类的。我的建议是不用背也用不着。真需要判断优先级的时候直接加括号让意图一目了然。boolean flag (a b c) (d ! 0);这段代码即使不查优先级表读起来也没有任何歧义。与其在优先级上花时间不如这几分钟拿去看循环的写法收益高得多。不过有一个优先级相关的常识还是要记的的优先级低于算术运算符所以a b c实际执行的是(a b) c这个写多了自然就顺了。3. 流程控制从顺序执行到分支循环编程逻辑开始真正运转3.1 if-else 与 switch什么场景该用哪个if-else 是万能的任何需要条件判断的地方都能用。但代码里如果出现一个变量分别等于几个值每个值对应不同的逻辑那用 switch 会清晰得多。老版本写法的 switch 有个著名的坑叫穿透每个 case 如果不写 break程序会继续执行下一个 case 里的代码直到遇到 break 或整个 switch 结束。这个特性早期经常被拿来面试比如让你猜int week 2; switch (week) { case 1: System.out.println(周一); case 2: System.out.println(周二); case 3: System.out.println(周三); }这段代码会同时输出周二和周三因为 case 2 没有 break。初学阶段记不住这个特性很正常但一定要知道写 case 时习惯性带上 break。如果你用的 JDK 版本比较新14 之后还能用箭头写法完全绕开穿透问题int week 2; switch (week) { case 1 - System.out.println(周一); case 2 - System.out.println(周二); case 3 - System.out.println(周三); default - System.out.println(未知); }我的建议是分支不超过三个用 if-else分支很多且判断的是同一个变量的取值用 switch如果判断的是一个范围比如分数 60 到 80那还是得用 if-else。没有谁更好只有合不合适。3.2 for、while 和 do-while 怎么选for、while、do-while 是三种循环但很多人学完都记不清它们的区别。最简单的理解方式for 循环适合明确知道循环几次的场景。比如遍历数组、打印 1 到 100次数是定的。while 循环适合条件满足就继续的场景。次数不确定可能一次都不执行。比如读文件直到文件结束。do-while 循环先执行一次再判断条件。适合无论如何都要先干一次的场景。我平时看到的初学代码里最典型的问题是明明是一个已知次数的任务非要用 while结果还要手动维护一个变量来计数。能用 for 的场景不用 while能让代码结构更清晰。来看一个对比// 用 while 打印 1 到 10 int i 1; while (i 10) { System.out.println(i); i; } // 用 for 打印 1 到 10 for (int j 1; j 10; j) { System.out.println(j); }for 的优势在于初始化、条件判断、步进三个部分都写在第一行循环逻辑一眼就能看全。while 则更适合条件本身才是重点的场景。3.3 循环里最常见的死循环条件永远为 true新手在写 while 循环的时候经常出现程序一运行就卡死控制台什么都不输出。这种多半就是死循环。最常见的写法是int i 1; while (i 10) { System.out.println(i); }循环体里忘了让变量 i 往前走条件永远成立。这种情况我在给初学者看代码时几乎每次都能遇到。解决的思路只有一个循环开始前先想清楚循环要结束必须发生什么变化。是计数器增加还是条件本身依赖某个外部输入。每次循环体里都要朝这个方向推进哪怕只是一行i。3.4 用一个小例子把流程控制串起来单纯讲语法太干我建议初学者用这个题目练手打印九九乘法表。for (int i 1; i 9; i) { for (int j 1; j i; j) { System.out.print(j * i (i * j) \t); } System.out.println(); }这个题目有意思的地方在于它需要嵌套循环而且内层循环的次数依赖外层的当前值。你一旦能写出这段代码对 for 循环、字符串拼接、转义字符\t的理解都会上一个台阶。想加难度的话还可以试试在控制台打印一个等腰三角形或菱形那会逼着你去思考空格和 * 的数量关系。提示控制台输出用System.out.print()不换行用System.out.println()换行这是初学阶段最容易被忽略的细节。打印图案类题目出错一大半是没搞清这两个方法的区别。4. 数组第一个真正需要理解引用概念的数据结构4.1 数组的声明、创建和默认值数组是同类型数据的有序集合这句话每个教程都写但真正理解它需要动手。创建一个能放 5 个整数的数组有两种常见写法int[] nums new int[5]; // 创建一个长度 5 的数组默认值是 0 int[] scores { 90, 85, 78 }; // 直接用初始值创建新手最容易不理解的是new int[5]里的默认值。你不赋值数组里的每个元素也有值int 类型的数组默认全是 0double 默认 0.0boolean 默认 false引用类型比如后面学的 String 数组默认是 null。这个特性后面经常用到比如统计时先初始化一个全 0 的计数器数组。还有一个细节数组长度用.length获取注意这里不是方法调用不需要写括号。这一点和 String 的.length()正好相反我见过不少人把两者搞混编译器直接报错。4.2 下标越界初学阶段必见的第一道异常数组的下标从 0 开始长度为 n 的数组合法下标是 0 到 n-1。这句话看着简单但刚写代码时几乎人人都会踩一次int[] nums new int[3]; nums[0] 10; nums[1] 20; nums[2] 30; System.out.println(nums[3]); // 运行时报 ArrayIndexOutOfBoundsException报错信息已经说得很清楚了下标 3 越界超过数组长度 3 的合法范围。这个异常是初学阶段的好朋友遇到它不要慌先把报错信息里提到的行号找到看看是不是下标写越界了。讲个我实际遇到过的案例有个同学写循环遍历数组从i 1开始到i nums.length结束结果循环里访问nums[i]时最后一次 i 恰好等于 length越界了。正确的遍历应该是i 0; i nums.length; i这个从 0 到 length-1的规则值得在心里多默念几遍。4.3 遍历数组的两种方式遍历是指把数组里的每个元素都过一遍。最基础的方式是普通 for 循环配合下标int[] nums { 10, 20, 30 }; for (int i 0; i nums.length; i) { System.out.println(nums[i]); }Java 还提供了一种更简洁的写法叫增强 for 循环for-eachfor (int n : nums) { System.out.println(n); }它的意思是把 nums 里的每个元素依次取出来赋值给 n。这种写法非常适合单纯的读取操作代码更短、不容易写错下标。但它有一个限制拿不到当前元素的下标。如果你想同时知道这是第几个元素那还是用普通 for 循环。4.4 二维数组和工具类 Arrays二维数组可以理解为数组的数组最常见的使用场景是表格、矩阵。它的初始化有两种方式int[][] matrix new int[3][3]; // 3 行 3 列默认全 0 int[][] data { { 1, 2 }, { 3, 4 }, { 5, 6 } }; // 三行两列访问二维数组的元素要用两个下标matrix[1][2]表示第 1 行从 0 算起第 2 列。遍历时需要两层循环嵌套外层控制行内层控制列。另外Java 的java.util.Arrays工具类有几个方法值得初学阶段就混个脸熟import java.util.Arrays; int[] nums { 3, 1, 2 }; Arrays.sort(nums); // 排序结果是 [1, 2, 3] System.out.println(Arrays.toString(nums)); // 输出 [1, 2, 3] Arrays.fill(nums, 0); // 把整个数组全部赋值为 0特别是Arrays.toString()它能直接以人能看懂的方式把数组内容打印出来调试的时候非常实用。很多人在初学阶段直接打印数组名System.out.println(nums)结果输出一串看不懂的东西[I15db9742然后怀疑自己写错了。其实那只是数组对象的地址表示想看得用Arrays.toString()。5. 字符串一个让你重新认识 和 equals 的重要对象5.1 String 的不可变性和字符串常量池Java 里的 String 虽然写起来像基本类型但它是一个类是一个对象。它有一个重要特性不可变。简单说一个字符串对象创建之后内容就不会再变了。你看到的字符串拼接生成的新字符串其实是创建了一个全新的对象而不是修改了原来的对象。String s hello; s s world; // s 现在指向一个新的字符串对象内容是 hello world因为不可变Java 还做了一个优化叫字符串常量池。代码里直接写的字符串字面量会被复用在池子里。比如String s1 hello; String s2 hello;s1 和 s2 会不会指向同一个对象答案是会因为两个字面量相同常量池里只需要保存一份。这个机制是理解后面 和 equals 区别的关键前提之一。5.2 和 equals每次面试都跑不掉的题初学阶段最容易被问懵的一个问题判断两个字符串内容是否相等用 行不行我直接说结论不行请用 equals。String s1 hello; String s2 new String(hello); System.out.println(s1 s2); // false比较的是对象地址 System.out.println(s1.equals(s2)); // true比较的是内容对于引用类型的含义是比较两个引用是否指向同一个对象也就是地址是否相同。s1 在常量池里s2 是 new 出来的新对象地址当然不一样。而equals()是被 String 类重写过的方法它专门用来比较内容。这也是我在第 2 章强调运算符的一个原因很多人不理解为什么s1 s2有时候是 true 有时候是 false根源在于没有区分值比较和引用比较。这里建议养成一个习惯只要是用来比较字符串内容一律用equals()别管它是不是同一个地址。这样既省心也不会踩到常量池在不同 JDK 版本下表现不一致的边角问题。5.3 常用字符串方法初学记这几个就够了String 的方法非常多但基础阶段真正高频用到的其实就这几个String s Hello World; s.length(); // 11注意这是方法调用要加括号 s.charAt(1); // e取第 1 个字符 s.indexOf(World); // 6找不到返回 -1 s.substring(0, 5); // Hello从下标 0 截到 5不包括 5 s.toUpperCase(); // HELLO WORLD s.toLowerCase(); // hello world s.contains(World); // true s.trim(); // 去掉字符串两端的空白这些方法都比较直观唯一容易记错的是substring()的参数范围含头不含尾。初学阶段编程或者面试时这种边界问题是高频失分点。你在练的时候可以随手写个小程序把这些方法都跑一遍输出的结果和预期对一下印象会深刻很多。5.4 字符串拼接的几个选项初学阶段通过拼接字符串是最自然的写法String name 张三; int age 18; System.out.println(姓名 name 年龄 age);这种写法在开发中占大多数场景够用且清晰。后面如果涉及大量拼接操作比如循环里反复给字符串加内容就需要考虑StringBuilder这类可变字符序列因为它不会每次都创建新的字符串对象。这个问题在基础阶段不用深究但可以留个印象字符串拼接的效率问题会在你写更复杂的程序时慢慢浮现出来。6. 方法拆分逻辑、封装复用值传递是绕不开的坎6.1 方法的结构方法就是一段可以被反复调用的代码块。定义一个方法有几个固定部分修饰符、返回类型、方法名、参数列表、方法体。基础阶段最常见的形式是这样的public static int add(int a, int b) { int sum a b; return sum; }这里public是访问修饰符暂时先照抄static暂时也先照抄等到学面向对象时才会真正理解它的含义。int是返回类型方法算完了一个整数结果要返回出去a和b是参数调用方传入的数据。调用方式也很直接int result add(3, 5); System.out.println(result); // 8方法的意义在于把一段具体逻辑封装起来名字起得好调用者和维护者都不需要关心内部细节。这不仅是代码复用的问题更是程序设计的起点。6.2 值传递传进去的是值不是变量这是初学方法时最大的一个坑。看代码public static void change(int x) { x 100; } int a 5; change(a); System.out.println(a); // 输出还是 5为什么不是 100因为 Java 的方法参数传递是值传递。change(a)传入的是变量 a 的值的拷贝方法里修改的是拷贝不影响原来的变量。这个规则可以用一句话概括方法里的参数变来变去外面的变量但凡类型是基本类型就不会受影响。那如果是数组呢数组是引用类型情况就不同了public static void modify(int[] arr) { arr[0] 999; } int[] nums { 1, 2, 3 }; modify(nums); System.out.println(nums[0]); // 输出 999这里传入的是指向数组对象的引用的拷贝。拷贝和原引用指向同一个数组对象所以方法里通过引用修改数组内容外面的数组确实会变。理解这二者的区别是初学阶段的一道分水岭。我的建议是遇到这样的代码别去硬背基本类型不受影响、引用类型受影响而是画一张图把变量、引用、对象之间的关系画出来一目了然。6.3 方法重载同名不同参方法重载是指多个方法名字相同但参数列表不同参数个数、类型不同。比如public static int add(int a, int b) { return a b; } public static double add(double a, double b) { return a b; }调用的时候Java 会根据你传入的参数类型自动选择对应的方法。add(1, 2)走第一个add(1.5, 2.5)走第二个。方法重载的意义是让调用方不用记住一堆不一样的名字统一名称、统一语义由编译器根据参数区分。这里有一个新手经常问的问题两个方法只是返回类型不同能不能构成重载不能。方法重载的判断标准是参数列表不包括返回类型。因为调用时你可能没接返回值编译器根本没法靠返回类型区分该调用哪个。6.4 递归方法自己调用自己递归是方法里比较神奇的一种用法方法在方法体中调用自己。初学最容易理解的例子是阶乘public static long factorial(int n) { if (n 0 || n 1) { return 1; } return n * factorial(n - 1); }递归的核心是两件事找出口终止条件和找递推公式。没有出口的递归会一直调用下去最终把栈内存耗尽抛StackOverflowError。这是初学阶段一个非常经典的程序崩溃方式运行的时候控制台会刷出密密麻麻的调用栈信息看着吓人其实就是递归没有收敛。我对初学者的建议是递归很有意思但不要过度执着。能用循环解决的优先用循环。递归的思考方式适合二叉树遍历、目录遍历等后面才会接触的场景基础阶段理解它的结构和出口思想就够了。7. 新手最常见的报错信息每一句都值得认真读7.1 编译错误和运行时错误先分清两件事初学阶段写代码报错主要分两类编译错误发生在程序运行之前通常是语法写错了、变量没声明、括号没配对、用了未定义的方法。这类错误最好解决因为编译器会明确告诉你哪个文件的哪一行有问题。IDE 里一般会在错误代码下面划红线鼠标移过去就有提示。运行时错误是编译通过了但程序跑起来之后才崩溃。这类错误对新手来说更棘手因为它们往往和逻辑有关而不仅仅是语法。看一条典型的异常信息Exception in thread main java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at Test.main(Test.java:9)最重要的是最后一行Test.java:9它告诉你出错的位置在第 9 行。往上一点异常类型是ArrayIndexOutOfBoundsException意思很直白数组下标越界。7.2 三大高频异常见多了就不慌了初学阶段遇到的运行时异常90% 落在下面这三类里。我把它们的特点和排查思路整理成一张表异常类型什么时候出现怎么排查ArrayIndexOutOfBoundsException数组下标越界找到报错行看循环的终止条件是否写成了 length或者直接访问了arr[length]NullPointerException调用了 null 对象的方法或属性找到报错行看哪个对象可能没初始化打印出来确认一下NumberFormatException把字符串转数字时格式不对例如Integer.parseInt(abc)就会抛这个异常检查输入内容是否真的全是数字空指针异常尤其值得多说一句。它通常不发生在代码刚刚写好的那一刻而在程序运行到某个分支时才出现。比如你根据条件创建了一个对象某个分支里忘了赋值后面再调用对象的方法就抛异常了。排查思路永远是报错行里出现的那个.前面是什么对象它有没有可能是 null。7.3 最简单的调试方法输出打印观察法我刚学编程的时候还没有现在这么成熟的 IDE 调试工具前辈教我的第一个调试手段就是在关键位置打印变量。for (int i 0; i nums.length; i) { System.out.println(i i , nums[i] nums[i]); // 其他逻辑 }这种做法虽然原始但对初学阶段特别有效。原因在于你不需要打断点、不需要理解单步执行这个概念只需要把变量的中间值打到控制台人脑顺着输出就能还原程序运行的轨迹。大量报错的根本原因是程序运行的路径和你以为的路径不一致打印变量能最快地暴露这个偏差。等你熟悉了变量值的变化规律再去学 IDE 里的断点调试会轻松很多。不必一开始就用高级玩法先学会让程序告诉你在哪一步出了问题这个能力比任何工具都重要。带过好几轮零基础的同学之后我越来越觉得基础阶段最应该练的不是背语法而是用代码描述日常逻辑。有一次一位刚学完基础的同学跟我说他用数组和循环把每天喝水的次数和时间点记下来了虽然只是最简单的几行代码但那种把想法变成程序的感觉比做完一整章习题都有价值。所以这篇基础篇的最后我不留一堆作业只给你一个建议今天就用运算符、流程控制、数组这三样东西写一个你生活中真实会用到的小工具比如统计一周的步数、算某门课程的平均分、判断一个数是不是质数。卡住了就回头翻这篇里的代码动手写一遍比盯着屏幕看十遍都管用。

相关新闻

手写词法与递归下降分析器:从正则到AST的完整实现

手写词法与递归下降分析器:从正则到AST的完整实现

简介:本资源是华东理工大学2022年《编译原理》课程核心实验的完整交付包,面向计算机专业本科生及编译技术初学者,聚焦词法分析与语法分析两大关键能力训练。压缩包共5个文件(2份Word实验报告、2个C源码文件、1个PL/0测试程序&…

2026/10/12 3:08:47 阅读更多 →
Hermes Agent 在 WSL2 里跑不起来?从 Ubuntu 24.04 到 systemd 自启的 TaoToken 排障清单

Hermes Agent 在 WSL2 里跑不起来?从 Ubuntu 24.04 到 systemd 自启的 TaoToken 排障清单

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

2026/10/12 3:08:47 阅读更多 →
Impeccable 设计美学实战:用 TaoToken 统一 Key 让 AI 前端 UI 输出更高级

Impeccable 设计美学实战:用 TaoToken 统一 Key 让 AI 前端 UI 输出更高级

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

2026/10/12 3:08:47 阅读更多 →

最新新闻

DAY70:前端Leader转型AI Agent工程师的认知跃迁

DAY70:前端Leader转型AI Agent工程师的认知跃迁

1. 为什么“DAY70”这个数字比“AI Agent”更值得深挖看到标题里那个醒目的“DAY70”,我第一反应不是去查AI Agent的最新论文,而是下意识翻开了自己三年前的项目日志——那会儿我正带一个五人前端团队,同时在啃LangChain源码、调试RAG pipeli…

2026/10/12 4:03:26 阅读更多 →
Kubernetes离线部署CoreDNS v1.8.0镜像导入与DNS解析实战

Kubernetes离线部署CoreDNS v1.8.0镜像导入与DNS解析实战

简介:coredns_v1.8.0.tar.gz 面向 Kubernetes 集群运维与部署人员,提供 v1.8.0 版本的 CoreDNS 镜像离线包,适用于 k8s v1.21.2 环境,可解决内网或受限网络下无法拉取官方镜像、集群 DNS 组件部署受阻的问题。压缩包共 8 个文件&a…

2026/10/12 4:03:26 阅读更多 →
iOS原生侧滑菜单实现:手势、布局与生命周期协同

iOS原生侧滑菜单实现:手势、布局与生命周期协同

简介:本资源是一份面向iOS初中级开发者的侧滑菜单栏实现方案,聚焦于点击按钮触发View位移动画的轻量级交互设计,适用于需要快速集成导航菜单或功能入口的App项目。压缩包共25个文件,包含7个Objective-C实现文件(.m/.h&…

2026/10/12 4:03:26 阅读更多 →
DataGridView 实现树形表格:自绘缩进、展开折叠与性能优化全指南

DataGridView 实现树形表格:自绘缩进、展开折叠与性能优化全指南

简介:面向 WinForms 开发者的 DataGridView 树形列表实现示例,解决表格控件无法直接展示层次数据的痛点。资源以 Visual Studio 2012 C# 为环境,提供完整项目与源码,涵盖树节点模型定义、控件扩展、数据绑定、列显隐控制、绘制展…

2026/10/12 4:03:26 阅读更多 →
Ubuntu下WPS中文显示方块?fontconfig字体配置与别名映射实战

Ubuntu下WPS中文显示方块?fontconfig字体配置与别名映射实战

简介:这份资源面向在 Ubuntu 系统下使用 WPS 办公软件、却频繁遇到字体缺失提示的用户,尤其是需要处理含特殊符号文档的办公与排版人群。当 WPS 弹出缺少 Symbol、Wingdings、Wingdings 2、Wingdings 3 等字体的警告时,文档中的符号与图形往往…

2026/10/12 4:03:26 阅读更多 →
WinForms Chart 时间轴实战:DateTime 转 OADate 与滚动条控制

WinForms Chart 时间轴实战:DateTime 转 OADate 与滚动条控制

简介:这份资源围绕VS自带Chart控件展开,面向需要在WinForms项目中实现时间轴图表的.NET开发者,重点解决x轴按时间刻度显示并配合滚动条浏览长时数据的问题。示例采用从Excel读取数据的方式,x轴时间格式为MM-dd HH:mm:ss:fff&#…

2026/10/12 4:02:25 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →