杰瑞科技汇

Java获取String长度用什么方法?

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

Java获取String长度用什么方法?-图1
(图片来源网络,侵删)

基础用法: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
    }
}

代码解释:

Java获取String长度用什么方法?-图2
(图片来源网络,侵删)
  • "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

对比数组的用法:

Java获取String长度用什么方法?-图3
(图片来源网络,侵删)
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😊" 由两部分组成:
    1. 'A':占用 1 个代码单元。
    2. 占用 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() 的使用。

分享:
扫描分享到社交APP
上一篇
下一篇