Java String 常用 API

29 阅读1分钟

一、创建和基本信息

1. 创建字符串

String str1 = "Hello";                    // 字面量创建(推荐)
String str2 = new String("Hello");        // 构造器创建
char[] chars = {'H','e','l','l','o'};
String str3 = new String(chars);          // 从字符数组
byte[] bytes = {72, 101, 108, 108, 111};
String str4 = new String(bytes);          // 从字节数组

2. 基本信息和比较

String s = "Hello World";

int len = s.length();                     // 长度:11
boolean empty = s.isEmpty();              // 是否为空:false
char c = s.charAt(0);                     // 获取字符:'H'

// 比较
boolean eq1 = s.equals("hello world");    // false(区分大小写)
boolean eq2 = s.equalsIgnoreCase("hello world"); // true(不区分大小写)
int cmp = s.compareTo("Hello");           // 字典序比较:6

二、查找和判断

1. 查找字符/子串

String s = "Hello World";

int index1 = s.indexOf('o');              // 4(第一次出现位置)
int index2 = s.lastIndexOf('o');          // 7(最后一次出现位置)
int index3 = s.indexOf("World");          // 6(子串位置)
int index4 = s.indexOf('o', 5);           // 7(从指定位置开始找)

boolean contains = s.contains("World");   // true

2. 判断开头/结尾

String s = "HelloWorld.java";

boolean starts = s.startsWith("Hello");   // true
boolean ends = s.endsWith(".java");       // true
boolean starts2 = s.startsWith("World", 5); // true(从偏移量5开始)

3. 匹配判断

String s = "Hello123";

boolean matches = s.matches("^Hello\\d+$"); // true(正则匹配)

三、截取和分割

1. 截取子串

String s = "Hello World";

String sub1 = s.substring(6);            // "World"(从位置6到末尾)
String sub2 = s.substring(0, 5);         // "Hello"([0,5))

2. 分割字符串

String csv = "apple,orange,banana";
String[] fruits = csv.split(",");        // ["apple", "orange", "banana"]

String complex = "a,b;c:d";
String[] arr = complex.split("[,;:]");   // 使用正则分割:["a","b","c","d"]

// 限制分割次数
String limited = "1-2-3-4-5";
String[] parts = limited.split("-", 3);  // ["1","2","3-4-5"]

四、转换和修改

1. 大小写转换

String s = "Hello World";

String upper = s.toUpperCase();          // "HELLO WORLD"
String lower = s.toLowerCase();          // "hello world"

2. 去除空白

String s = "  Hello World  ";

String trimmed = s.trim();               // "Hello World"(去除首尾空格)
String stripped = s.strip();             // Java 11+ 更好的空白处理
String leading = s.stripLeading();       // Java 11+ 去开头空白
String trailing = s.stripTrailing();     // Java 11+ 去末尾空白

3. 替换内容

String s = "Hello World";

// 字符替换
String rep1 = s.replace('l', 'L');       // "HeLLo WorLd"

// 字符串替换
String rep2 = s.replace("World", "Java"); // "Hello Java"

// 正则替换
String rep3 = s.replaceAll("\\s+", "-"); // "Hello-World"
String rep4 = s.replaceFirst("l", "L");  // "HeLlo World"(替换第一个)

4. 格式化

String format = String.format("姓名:%s,年龄:%d,成绩:%.2f", 
                             "张三", 20, 95.5);
// "姓名:张三,年龄:20,成绩:95.50"

String joined = String.join("-", "2023", "12", "31"); // "2023-12-31"

五、字符数组和字节数组

1. 与字符数组互转

String s = "Hello";

// 字符串转字符数组
char[] chars = s.toCharArray();

// 字符数组转字符串
String fromChars = new String(chars);
String joinChars = String.valueOf(chars);

2. 与字节数组互转

String s = "Hello";

// 字符串转字节数组(使用默认编码)
byte[] bytes1 = s.getBytes();

// 指定编码
byte[] bytes2 = s.getBytes("UTF-8");
byte[] bytes3 = s.getBytes(StandardCharsets.UTF_8);

// 字节数组转字符串
String fromBytes = new String(bytes1);
String fromBytes2 = new String(bytes2, "UTF-8");

六、其他实用方法

1. 重复和缩进

// Java 11+
String repeated = "Java".repeat(3);      // "JavaJavaJava"
String indented = "Hello\nWorld".indent(2); // 添加缩进

2. 转换方法

// 各种类型转字符串
String s1 = String.valueOf(123);         // "123"
String s2 = String.valueOf(3.14);        // "3.14"
String s3 = String.valueOf(true);        // "true"
String s4 = String.valueOf(new Object()); // 调用toString()

// 其他转字符串
String s5 = Integer.toString(100);
String s6 = Double.toString(3.1415);

3. 判断空白

String s1 = "  ";
String s2 = "";

boolean blank1 = s1.isBlank();           // true(Java 11+)
boolean blank2 = s2.isBlank();           // true
boolean empty = s2.isEmpty();            // true

七、StringBuilder 和 StringBuffer

1. StringBuilder(非线程安全,性能好)

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
sb.insert(5, ",");                       // "Hello, World"
sb.delete(5, 6);                         // "Hello World"
sb.reverse();                            // "dlroW olleH"
String result = sb.toString();           // 转换为String

2. StringBuffer(线程安全)

StringBuffer sb = new StringBuffer();
// 方法与StringBuilder相同,但线程安全

八、性能提示和最佳实践

1. 字符串比较

// ❌ 错误
if (str == "test") { ... }              // 比较地址,可能错误

// ✅ 正确
if ("test".equals(str)) { ... }         // 避免NullPointerException
if (str != null && str.equals("test")) { ... }

2. 字符串拼接

// ❌ 性能差(创建多个String对象)
String result = "";
for (int i = 0; i < 100; i++) {
    result += i;
}

// ✅ 性能好
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
    sb.append(i);
}
String result = sb.toString();

3. 字符串池

String s1 = "hello";                     // 放入字符串常量池
String s2 = "hello";                     // 从池中复用
String s3 = new String("hello");         // 创建新对象

System.out.println(s1 == s2);           // true(同一对象)
System.out.println(s1 == s3);           // false(不同对象)
System.out.println(s1.equals(s3));      // true(内容相同)

九、实际应用示例

public class StringExample {
    public static void main(String[] args) {
        // 1. 文件路径处理
        String path = "/usr/local/bin/java";
        String filename = path.substring(path.lastIndexOf("/") + 1);
        String extension = filename.substring(filename.lastIndexOf(".") + 1);
        
        // 2. 邮箱验证
        String email = "user@example.com";
        boolean isValid = email.matches("^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$");
        
        // 3. CSV解析
        String csv = "John,Doe,30,New York";
        String[] fields = csv.split(",");
        
        // 4. 格式化输出
        String template = "用户:%s,积分:%d,等级:%c";
        String message = String.format(template, "Alice", 1500, 'A');
        
        // 5. 敏感信息隐藏
        String phone = "13800138000";
        String masked = phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }
}

总结要点

  1. 不可变性:String对象一旦创建不可修改,所有"修改"操作都返回新对象
  2. 字符串池:字面量创建的字符串会放入常量池,可复用
  3. 性能考虑:频繁修改用StringBuilder/StringBuffer
  4. 编码注意:处理中文等非ASCII字符时注意编码问题
  5. null安全:使用"text".equals(str)避免NPE