字符串是字符的序列
在 Java 中,一个 String 对象可以被看作是一个字符的序列,每个字符在这个序列中都有一个固定的位置,这个位置就是它的下标或索引。

- 索引从 0 开始:这是编程语言中一个非常普遍的约定,第一个字符的索引是
0,第二个是1,以此类推。 - 最后一个字符的索引是
length() - 1:如果一个字符串的长度是n,那么它的有效索引范围是0到n-1。
如何获取字符串的长度?
在操作下标之前,我们通常需要知道字符串的长度,以避免越界错误,使用 String 类的 length() 方法。
String str = "Hello, World!"; int length = str.length(); // length 的值是 13
如何通过下标访问字符?
Java 提供了 charAt(int index) 方法来获取指定下标处的字符。
语法
public char charAt(int index)
index: 你想要获取的字符的下标。- 返回值: 一个
char类型的字符。
示例
String greeting = "你好,世界!";
// 获取第一个字符
char firstChar = greeting.charAt(0); // '你'
// 获取第三个字符
char thirdChar = greeting.charAt(2); // '世'
// 获取最后一个字符
int lastIndex = greeting.length() - 1; // 5
char lastChar = greeting.charAt(lastIndex); // '!'
System.out.println("第一个字符: " + firstChar);
System.out.println("第三个字符: " + thirdChar);
System.out.println("最后一个字符: " + lastChar);
⚠️ 重要:StringIndexOutOfBoundsException
当你尝试访问一个不存在的下标时,程序会抛出 StringIndexOutOfBoundsException 异常,这通常发生在以下两种情况:
- 下标小于 0(负数)。
- 下标大于或等于字符串的长度(即
index >= length())。
示例(会引发异常)
String text = "Java";
// 错误示例1:下标为负数
try {
char c = text.charAt(-1); // 抛出 StringIndexOutOfBoundsException
} catch (StringIndexOutOfBoundsException e) {
System.out.println("捕获到异常: " + e.getMessage());
}
// 错误示例2:下标等于长度
try {
char c = text.charAt(4); // "Java"的长度是4,最大有效下标是3,这里会抛出异常
} catch (StringIndexOutOfBoundsException e) {
System.out.println("捕获到异常: " + e.getMessage());
}
最佳实践:在通过下标访问字符之前,最好先进行边界检查。

String text = "Java";
int index = 4;
if (index >= 0 && index < text.length()) {
char c = text.charAt(index);
System.out.println("字符是: " + c);
} else {
System.out.println("下标 " + index + " 超出范围!");
}
常见操作:遍历字符串
通过 charAt() 和 for 循环,我们可以轻松地遍历字符串中的每一个字符。
使用 for 循环(传统方式)
String str = "遍历我";
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
System.out.println("下标 " + i + " 处的字符是: " + ch);
}
使用增强型 for 循环(更简洁)
这种方式不需要手动管理下标,但如果你需要知道当前字符的下标,就需要借助额外的变量。
String str = "遍历我";
int index = 0;
for (char ch : str.toCharArray()) { // toCharArray() 将字符串转为字符数组
System.out.println("下标 " + index + " 处的字符是: " + ch);
index++;
}
字符串是不可变的
一个非常重要的概念是:Java 中的 String 对象是不可变的,这意味着一旦创建,它的内容就不能被改变。
charAt() 方法只是读取指定位置的字符,它不会修改字符串,你不能通过类似 str.charAt(0) = 'J' 这样的语法来修改字符,因为这种语法在 Java 中是不存在的。

如果你想修改字符串,必须创建一个新的 String 对象。
// 错误的修改方式(Java 不允许) // String str = "hello"; // str.charAt(0) = 'H'; // 编译错误! // 正确的“修改”方式(创建新字符串) String original = "hello"; String modified = "H" + original.substring(1); // "H" + "ello" -> "Hello" System.out.println(original); // 输出 "hello" (原字符串未变) System.out.println(modified); // 输出 "Hello" (这是一个新的字符串)
| 操作 | 方法 | 描述 | 示例 |
|---|---|---|---|
| 获取长度 | length() |
返回字符串中的字符数量。 | int len = "abc".length(); // len = 3 |
| 获取字符 | charAt(int index) |
返回指定下标处的字符。下标从 0 开始。 | char c = "abc".charAt(1); // c = 'b' |
| 检查下标 | 手动检查 | 避免因下标越界而引发异常。 | if (index < str.length() && index >= 0) |
| 遍历字符串 | for 循环 + charAt() |
按顺序访问每个字符。 | for (int i=0; i<str.length(); i++) { ... } |
| 核心特性 | 不可变性 | String 对象创建后内容不能改变,charAt() 只读不写。 |
不能用 str.charAt(0) = 'x' 来修改。 |
理解字符串的下标是进行字符串处理(如查找、替换、解析等)的基础,请务必牢记索引从 0 开始和注意边界检查这两个关键点。
