下面我将从基础用法、常见误区、以及相关的知识点进行详细说明。

基础用法:length() 方法
String 类提供了一个名为 length() 的公共方法,它返回 int 类型的值,表示该字符串中的字符数量。
语法:
int length = yourString.length();
示例代码:
public class StringLengthExample {
public static void main(String[] args) {
String str1 = "Hello, World!";
String str2 = "Java";
String str3 = ""; // 空字符串
String str4 = " "; // 包含一个空格的字符串
// 获取并打印字符串长度
System.out.println("字符串 \"" + str1 + "\" 的长度是: " + str1.length()); // 输出: 13
System.out.println("字符串 \"" + str2 + "\" 的长度是: " + str2.length()); // 输出: 4
System.out.println("字符串 \"" + str3 + "\" 的长度是: " + str3.length()); // 输出: 0
System.out.println("字符串 \"" + str4 + "\" 的长度是: " + str4.length()); // 输出: 1
}
}
代码解释:

"Hello, World!"包含 13 个字符(包括逗号、空格和感叹号)。"Java"包含 4 个字符。- 是一个空字符串,不包含任何字符,所以长度为 0。
- 包含一个空格字符,所以长度为 1。
常见误区:length vs. length()
这是 Java 初学者最容易混淆的一点。
| 特性 | length (属性) |
length() (方法) |
|---|---|---|
| 所属类 | java.lang.Array (数组) |
java.lang.String (字符串) |
| 语法 | array.length (没有括号) |
string.length() (有括号) |
| 返回值 | int |
int |
| 作用 | 获取数组的长度(元素个数) | 获取字符串的长度(字符个数) |
错误示例:
String myString = "test"; // 错误!String 类没有 length 属性,只有 length() 方法。 int len = myString.length; // 编译错误: cannot find symbol: variable length
正确示例:
String myString = "test"; // 正确!调用 String 的 length() 方法。 int len = myString.length(); // len 的值是 4
对比数组的用法:

int[] numbers = {1, 2, 3, 4, 5};
// 正确!获取数组的长度使用 length 属性。
int arrayLen = numbers.length;
// arrayLen 的值是 5
重要知识点:length() 与字符编码
length() 方法返回的是代码单元(code unit)的数量,而不是代码点(code point)的数量,这在处理包含特殊字符(如 Emoji 或某些非拉丁文字符)的字符串时尤其重要。
在 Java 中:
char类型使用 UTF-16 编码。- 大多数常用字符(如英文字母、汉字)在 UTF-16 中都占用一个代码单元。
- 一些特殊的字符(如 Emoji 表情符号 ,某些罕见汉字等)在 UTF-16 中需要两个代码单元来表示(称为“代理对”,surrogate pair)。
示例:计算 Emoji 字符串的长度
public class StringCodePointExample {
public static void main(String[] args) {
// 字符串包含一个英文字母和一个 Emoji
String str = "A😊";
// length() 返回的是代码单元的数量
int codeUnitCount = str.length();
System.out.println("代码单元数量 (str.length()): " + codeUnitCount); // 输出: 3
// 要获取真正的字符(代码点)数量,应该使用 codePointCount()
int codePointCount = str.codePointCount(0, str.length());
System.out.println("代码点数量 (str.codePointCount()): " + codePointCount); // 输出: 2
}
}
解释:
- 字符串
"A😊"由两部分组成:'A':占用 1 个代码单元。- 占用 2 个代码单元(一个高代理项和一个低代理项)。
str.length()返回1 + 2 = 3。- 而
str.codePointCount()方法会正确地识别 为一个单一的代码点,因此返回1 + 1 = 2。
如何正确遍历包含代理对的字符串?
如果你需要遍历字符串并处理每个字符(而不是每个代码单元),应该使用 codePointAt() 方法。
String str = "A😊B";
System.out.println("字符串: " + str);
System.out.println("length(): " + str.length()); // 输出 4
for (int i = 0; i < str.length(); ) {
int codePoint = str.codePointAt(i);
// 将代码点转换为字符并打印
System.out.println("字符: " + (char) codePoint);
// 重要:根据代码点的大小增加索引
// 如果是普通字符,增加 1;如果是代理对,增加 2
i += Character.charCount(codePoint);
}
输出:
字符串: A😊B
length(): 4
字符: A
字符: 😊
字符: B
如果直接使用 charAt(),你会错误地得到代理对中的两个部分。
性能考虑
length()方法的性能非常高,它的时间复杂度是 O(1),即常数时间,这是因为String对象内部会维护一个private final int value[]数组来存储字符,而length()方法实际上是直接返回这个数组的长度value.length,所以它不需要遍历整个字符串。- 在任何需要获取字符串长度的场景下,都可以放心地使用
length()方法,它不会成为性能瓶颈。
| 需求 | 推荐方法 | 说明 |
|---|---|---|
| 获取字符串中字符的数量 | string.length() |
最常用,返回 UTF-16 代码单元的数量,对于大多数情况(不含 Emoji)结果正确。 |
| 获取字符串中实际字符(代码点)的数量 | string.codePointCount(0, string.length()) |
在处理包含 Emoji、罕见汉字等需要代理对的字符时使用,能返回正确的字符数。 |
| 获取数组的长度 | array.length |
注意:这是数组的属性,不是方法。 |
对于日常开发,string.length() 是获取字符串长度的标准方法即可,只有在处理国际化文本或包含特殊符号的字符串时,才需要考虑 codePointCount() 的使用。
