一、方法定义

public char charAt(int index)
  • 所属类java.lang.String
  • 功能:返回字符串中指定索引处的字符(char)。
  • 参数
    • index:字符的索引(从0开始)。
  • 返回值char类型,指定索引处的字符。
  • 异常
    • 抛出StringIndexOutOfBoundsException,如果index < 0index >= length()

二、功能说明

  1. 字符访问
    • 直接访问字符串中任意位置的字符,索引从0开始。
    • 例如:"Hello".charAt(0)返回'H'"Hello".charAt(4)返回'o'
  2. 不可变性
    • 该方法不会修改原字符串。
  3. 底层实现
    • 字符串内部以字符数组存储,charAt()通过索引直接访问,时间复杂度为O(1)

三、示例代码

1. 基础用法

String str = "Hello, World!";
char firstChar = str.charAt(0);  // 'H'
char spaceChar = str.charAt(5);  // ','
char lastChar = str.charAt(str.length() - 1);  // '!'
System.out.println(firstChar);  // 输出 H
System.out.println(spaceChar);  // 输出 ,
System.out.println(lastChar);   // 输出 !

2. 处理null的情况

String str = null;
char ch = str.charAt(0);  // 抛出 NullPointerException

3. 结合其他方法使用

String str = "Java Programming";
char thirdChar = str.charAt(2);  // 'v'
System.out.println("第三个字符是: " + thirdChar);

四、使用技巧

  1. 遍历字符串

    String str = "Hello";
    for (int i = 0; i < str.length(); i++) {
        System.out.print(str.charAt(i) + " ");
    }
    // 输出: H e l l o 
    
  2. 验证字符是否存在

    String str = "Java";
    boolean containsA = false;
    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == 'a') {
            containsA = true;
            break;
        }
    }
    System.out.println("是否包含字符 'a': " + containsA);
    
  3. 处理多语言字符(Unicode代理对)

    • 对于包含代理对的字符(如表情符号),需使用codePointAt()
      String emoji = "😊";
      int codePoint = emoji.codePointAt(0);  // 获取 Unicode 编码
      

五、常见错误

  1. 索引越界

    String str = "Hello";
    char ch = str.charAt(5);  // 抛出 StringIndexOutOfBoundsException
    
  2. 未检查null导致异常

    String str = null;
    char ch = str.charAt(0);  // 抛出 NullPointerException
    
  3. 误解返回值类型

    • charAt()返回char而非String,需显式转换为字符串:
      String str = "A";
      String firstCharStr = String.valueOf(str.charAt(0));  // "A"
      

六、注意事项

  1. 索引范围验证

    • 确保index[0, length()-1]范围内。
    • 使用if (index >= 0 && index < str.length())提前判断。
  2. 空字符串处理

    • 空字符串""length()为0,调用charAt(0)会抛出异常。
  3. 字符编码问题

    • 对于高Unicode字符(如表情符号),charAt()返回单个代理项,需结合codePointAt()处理。

七、最佳实践

  1. 安全访问字符

    • 使用工具类(如Apache Commons Lang的StringUtils)进行空值检查:
      if (StringUtils.isNotEmpty(str)) {
          char ch = str.charAt(0);
      }
      
  2. 缓存字符串长度

    • 避免重复调用length()
      int len = str.length();
      for (int i = 0; i < len; i++) { ... }
      
  3. 异常处理

    • 捕获索引越界异常,避免程序崩溃:
      try {
          char ch = str.charAt(100);
      } catch (StringIndexOutOfBoundsException e) {
          System.out.println("索引超出范围");
      }
      

八、性能优化

场景 优化建议
高频调用 charAt()时间复杂度为O(1),适合高频访问。
遍历字符串 使用for循环直接访问字符,避免转换为字符数组。
多语言字符 使用codePointAt()处理代理对,确保准确性。

九、总结

  1. 核心功能charAt(int index)用于访问字符串中指定索引的字符,索引从0开始。
  2. 关键实践
    • 调用前检查null和索引范围。
    • 使用codePointAt()处理Unicode代理对。
    • 缓存字符串长度以提高性能。
  3. 性能保障:方法高效,适合高频调用,但需注意异常处理和编码问题。