第 4 章 · 数组、String 与常用 API
本章目标:掌握一维/二维数组声明、初始化与遍历;理解数组是定长引用类型;熟练使用 String 不可变特性与 StringBuilder;掌握 length、charAt、substring、indexOf、split、trim、equals 等常用 API;能完成 toolkit-demo 的商品标签解析与CSV 行处理;对照 python-dev ch04 列表与字符串。
学时建议:4 小时(含 1.5 小时跟练)
前置:完成 java-dev ch03;建议已学 python-dev ch04。
4.1 场景说明:商品标签与 CSV 行
toolkit-demo 从虚构 CSV 行解析商品 ID、名称与标签列表,并生成展示用标题——类似 python-dev 中用 split 处理 a,b,c 字符串。
输入行:SKU001,Java入门书,hot|new|edu
输出: [SKU001] Java入门书 (标签:hot, new, edu)
learn-java/toolkit-demo/src/main/java/demo/text/
├── ArrayBasics.java
├── StringApiDemo.java
└── ProductLineParser.java
4.2 数组基础
4.2.1 声明与初始化
int[] scores = new int[5]; // 默认值 0
int[] primes = {2, 3, 5, 7, 11};
String[] names = new String[] {"Alice", "Bob"};
int len = scores.length; // 5,注意是属性非方法
| 对比 | Python list | Java 数组 |
|---|---|---|
| 长度 | 动态 append | 固定 length |
| 类型 | 可混合(不推荐) | 元素类型一致 |
| 越界 | IndexError | ArrayIndexOutOfBoundsException |
4.2.2 遍历
for (int i = 0; i < scores.length; i++) {
scores[i] = i * 10;
}
for (int s : scores) {
System.out.println(s);
}
4.2.3 二维数组
int[][] matrix = new int[3][4];
int[][] grid = {{1, 2}, {3, 4}, {5, 6}};
for (int r = 0; r < grid.length; r++) {
for (int c = 0; c < grid[r].length; c++) {
System.out.print(grid[r][c] + " ");
}
System.out.println();
}
4.3 数组与内存示意
names ──→ [引用0] ──→ "Alice"
[引用1] ──→ "Bob"
数组变量存的是堆上数组对象的引用;names[0] = null 可断开引用。
int[] a = {1, 2, 3};
int[] b = a; // 同一数组
b[0] = 99;
System.out.println(a[0]); // 99
复制需 Arrays.copyOf:
import java.util.Arrays;
int[] copy = Arrays.copyOf(a, a.length);
4.4 String 不可变
String s = "hello";
s.toUpperCase(); // 返回新字符串,s 仍为 "hello"
String upper = s.toUpperCase();
| 操作 | 是否修改原串 |
|---|---|
toUpperCase | 否,返回新对象 |
+ 拼接 | 产生新对象 |
| 大量拼接 | 用 StringBuilder |
字符串常量池:字面量 "java" 可能复用同一对象,故 == 有时为 true,但业务比较一律 equals。
String x = "java";
String y = "java";
String z = new String("java");
System.out.println(x == y); // 可能 true
System.out.println(x.equals(z)); // true
4.5 StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
sb.append("id").append(i).append(",");
}
String result = sb.toString();
// 删除末尾逗号
if (result.endsWith(",")) {
result = result.substring(0, result.length() - 1);
}
| Python | Java |
|---|---|
"".join(parts) | String.join(",", parts) 或 StringBuilder |
| 列表累加 | StringBuilder append |
String joined = String.join(", ", "hot", "new", "edu");
4.6 常用 String API 表
| 方法 | 作用 | 示例结果 |
|---|---|---|
length() | 字符个数 | "ab".length() → 2 |
charAt(i) | 取字符 | "ab".charAt(0) → 'a' |
substring(start,end) | 子串 | "hello".substring(1,3) → "el" |
indexOf(s) | 查找位置 | "abc".indexOf("b") → 1 |
contains(s) | 是否包含 | "abc".contains("a") → true |
startsWith/endsWith | 前缀后缀 | — |
toLowerCase/toUpperCase | 大小写 | — |
trim | 去首尾空白 | " a ".trim() → "a" |
strip(11+) | Unicode 空白 | 更彻底 |
split(regex) | 分割 | "a,b".split(",") |
replace | 替换 | "a-b".replace("-","_") |
equals | 内容相等 | 不用 == |
equalsIgnoreCase | 忽略大小写 | — |
isEmpty/isBlank | 空串判断 | "".isBlank() → true |
format | 格式化 | String.format("%.2f", 3.1) |
String line = " SKU001, 书 , hot|new ";
line = line.strip();
String[] parts = line.split(",", 3); // 最多分 3 段
注意:split("|") 中 | 是正则特殊字符,应 split("\\|")。
4.7 ArrayBasics 完整代码
package demo.text;
import java.util.Arrays;
/**
* 数组基础练习 — toolkit-demo