Java 常用语法极简通关(四):数组与字符串的常用操作

📅 2026/8/11 15:07:24
Java 常用语法极简通关(四):数组与字符串的常用操作
开篇一个巡检成绩表处理程序上一章的成绩统计里数组已经露过脸了int[] scores {92, 85, ...}。这一章把它讲透再把日常开发中刷屏的 String 方法一口气过完。还是先看一段完整程序——录入一组成绩做排序展示、查最高最低、格式化输出一张简易成绩表public class ScoreTableApp { public static void main(String[] args) { // 1. 声明并初始化数组 int[] scores {85, 92, 74, 66, 90}; String[] names {张伟, 李强, 王磊, 赵鹏, 陈刚}; // 2. 求最高分、最低分、平均分 int max scores[0]; int min scores[0]; int sum 0; for (int i 0; i scores.length; i) { if (scores[i] max) { max scores[i]; } if (scores[i] min) { min scores[i]; } sum scores[i]; } double avg (double) sum / scores.length; // 3. 打印成绩表拼接出整齐的表头 StringBuilder table new StringBuilder(); table.append( 巡检成绩表 \n); for (int i 0; i names.length; i) { String name names[i]; // 名字不足 3 个字的后面补空格对齐 if (name.length() 3) { name name ; } table.append(name).append().append(scores[i]).append( 分\n); } System.out.print(table.toString()); // 4. 输出统计结论 System.out.println(最高分 max 最低分 min 平均分 avg); // 5. 找出第一个优秀者的名字 for (int i 0; i scores.length; i) { if (scores[i] 90) { System.out.println(首个优秀者 names[i].trim()); break; } } } }运行结果 巡检成绩表 张伟 85 分 李强 92 分 王磊 74 分 赵鹏 66 分 陈刚 90 分 最高分92最低分66平均分81.4 首个优秀者李强程序里涉及三样东西数组、String 方法、StringBuilder分三部分讲。第一部分数组——定长的同类型容器声明与初始化的两种姿势// 姿势一声明时直接给值最常用 int[] scores {85, 92, 74, 66, 90}; // 姿势二只给长度元素拿默认值 int[] arr new int[5]; // 5 个元素全是 0 String[] names new String[3]; // 3 个元素全是 null要点int[]是一个整体——int 的数组这种类型。数组可以装基本类型也可以装引用类型。new int[5]创建后元素自动填默认值int 是 0double 是 0.0boolean 是 false引用类型包括 String是 null。数组长度创建时定死之后不能变。这是数组最大的局限也是后来 ArrayList第九章登场的理由。三件套下标、length、遍历scores[0] // 取第一个元素下标从 0 开始 scores.length // 长度5注意数组的 length 是属性没有括号 scores[i] 100; // 按下标赋值遍历的两种写法第三章已讲这里对号入座for (int i 0; i scores.length; i) { ... } // 要下标用经典 for for (int s : scores) { ... } // 纯取值用增强 for必知坑数组越界ArrayIndexOutOfBoundsException下标的合法范围是0 到 length-1访问scores[5]长度就是 5 时运行期直接抛异常int[] scores {85, 92, 74}; System.out.println(scores[3]); // 编译能过运行崩溃ArrayIndexOutOfBoundsException这类异常是新手期最常见的运行时报错。越界十有八九来自i scores.length这种边界写错记住标准姿势是 length。顺带一提多维数组如int[][] matrix存在但业务代码里用得很少软考偶尔露脸知道int[3][4]是 3 行 4 列即可本系列不展开。第二部分String 的常用方法——就这一把天天用String 类的方法有几十个日常高频的如下表结合案例逐个看方法作用例子length()字符个数锚杆.length()→ 2charAt(i)取下标 i 的字符锚杆.charAt(0)→锚substring(a, b)截取 [a, b) 区间设备巡检.substring(0, 2)→设备indexOf(str)找子串首次出现的位置3号皮带.indexOf(皮带)→ 2contains(str)是否包含子串井下-580m.contains(580)→ trueequals(str)内容比较第二章铁律equalsIgnoreCase(str)忽略大小写比较abc.equalsIgnoreCase(ABC)→ truetrim()去掉首尾空白 维修 .trim()→维修split(分隔符)拆成字符串数组85,92,74.split(,)→[85,92,74]replace(旧, 新)替换全部匹配a-b-c.replace(-, /)→a/b/cstartsWith / endsWith前缀/后缀判断文件名、编号判断常用toUpperCase / toLowerCase大小写转换统一格式用结合案例看几个典型的① 名字对齐用的length()if (name.length() 3) { name name ; // 不足 3 字补空格表格才齐 }注意区分数组的 length 是属性scores.lengthString 的 length 是方法name.length()。带不带括号是经典笔误点也是考点。② 解析 CSV 风格的数据split()trim()是黄金搭档String line 张伟 , 92 , 综采一队 ; String[] parts line.split(,); String name parts[0].trim(); // 张伟 int score Integer.parseInt(parts[1].trim()); // 92字符串转 int第十章细讲③ 判断后再截取indexOf()配合substring()String location 井下-580m东翼大巷; int idx location.indexOf(m); if (idx 0) { // indexOf 找不到会返回 -1先判断 String depth location.substring(3, idx 1); // 580m }④ 前缀判断处理编号String code WX-2026-0341; if (code.startsWith(WX-)) { System.out.println(这是一条维修单); }别忘了第二章讲过的 String 不可变性这些方法全部返回新字符串原字符串纹丝不动。name.trim()之后要把结果接回来——name name.trim();光调用不接收等于白调用。第三部分StringBuilder——循环拼接的唯一正确姿势案例里拼成绩表用的是 StringBuilderStringBuilder table new StringBuilder(); table.append( 巡检成绩表 \n); for (int i 0; i names.length; i) { table.append(name).append().append(scores[i]).append( 分\n); } System.out.print(table.toString());为什么不用熟悉的回顾第二章String 不可变每次都新建一个对象。循环 1000 次就产生 1000 个临时字符串对象内存和速度都是浪费。StringBuilder 内部是一块可变的字符缓冲区append是原地追加不产生新对象最后toString()一次成型。用法就三个动作StringBuilder sb new StringBuilder(); // 1. 创建 sb.append(a).append(100).append(b); // 2. 追加可链式什么类型都能塞 String result sb.toString(); // 3. 转成 String规则一句话循环里拼字符串用 StringBuilder一次性拼两三个用就行编译器对简单的拼接有优化不用矫枉过正。案例里还有个细节\n是换行符转义字符。常用的转义就三个\n换行、\t制表符、\在字符串里表示一个双引号本身。一个隐患两个数组按下标对应有多脆弱回头看案例的数据结构int[] scores {85, 92, 74, 66, 90}; String[] names {张伟, 李强, 王磊, 赵鹏, 陈刚};张伟得 85 分这个关系靠的是两个数组下标对齐来维系的names[i] 的成绩是 scores[i]。程序跑对的前提是录入时两边顺序严格一致。问题在于这种对应关系编译器完全不管。假设录入时手一抖names 里漏了一个人或者顺序排错程序照样编译通过、照样运行只是从此以后李强的成绩全是别人的——结果张冠李戴还不会有任何报错提示。这是数组时代最隐蔽的逻辑 bug 温床。解法其实直觉上很简单把姓名、成绩、班组捆在一起装进一个工人里让它们物理上不可分。这个捆在一起的手段就是下一章的主角——类与对象。常踩的坑排雷清单数组越界下标合法范围 0 ~ length-1边界一律写i length。length 带不带括号数组scores.length属性Stringname.length()方法记死这个区别。String 方法不接收返回值s.trim()之后 s 没变字符串不可变必须s s.trim()。substring 的右边界不含substring(0, 2)取下标 0 和 1左闭右开和很多人的直觉相反。indexOf 找不到返回 -1直接用返回值当下标会越界先判 0。循环里用拼长字符串几百上千次循环后性能明显下降该上 StringBuilder。多数组按下标对应数据错位不报错是最隐蔽的逻辑 bug 温床。本章小结数组定长、同类型两种初始化姿势元素默认值int 为 0、引用为 null越界是运行时异常。String 高频方法就那一把length()、substring()、indexOf()、contains()、trim()、split()、replace()、startsWith等全部返回新串。StringBuildernew→append→toString()三步循环拼接的唯一正确姿势。数组按下标对应多份数据的痛点引出了下一章的主角。下一章是全系列的地基类与对象——字段、方法、构造器、this 与 static。我们会把姓名成绩班组封装成一个真正的工人对象亲手解决本章结尾的数据错位问题。