← 返回首页
📝

Java字符串详解:String、StringBuilder与StringBuffer

📂 java ⏱ 4 min 740 words

Java字符串详解:String、StringBuilder与StringBuffer

概述

字符串是Java中最常用的数据类型之一。Java提供了三种字符串类:String、StringBuilder和StringBuffer,它们各有特点和适用场景。

1. String类

不可变性

String类是不可变的,一旦创建就不能修改:

public class StringImmutabilityExample {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        String str3 = new String("Hello");
        
        // 字符串比较
        System.out.println("str1 == str2: " + (str1 == str2));  // true
        System.out.println("str1 == str3: " + (str1 == str3));  // false
        System.out.println("str1.equals(str3): " + str1.equals(str3));  // true
        
        // 字符串拼接创建新对象
        String str4 = str1 + " World";
        System.out.println("str4: " + str4);  // Hello World
        System.out.println("str1: " + str1);  // Hello(未改变)
    }
}

常用方法

public class StringMethodsExample {
    public static void main(String[] args) {
        String str = "Hello, World!";
        
        // 获取信息
        System.out.println("长度: " + str.length());
        System.out.println("是否为空: " + str.isEmpty());
        System.out.println("字符: " + str.charAt(0));
        
        // 查找
        System.out.println("索引: " + str.indexOf('W'));
        System.out.println("最后索引: " + str.lastIndexOf('l'));
        System.out.println("包含: " + str.contains("World"));
        
        // 截取
        System.out.println("子串: " + str.substring(7));
        System.out.println("子串: " + str.substring(0, 5));
        
        // 转换
        System.out.println("大写: " + str.toUpperCase());
        System.out.println("小写: " + str.toLowerCase());
        System.out.println("去除空格: " + str.trim());
        
        // 替换
        System.out.println("替换: " + str.replace('l', 'L'));
        System.out.println("替换: " + str.replace("World", "Java"));
        
        // 分割
        String[] parts = str.split(", ");
        for (String part : parts) {
            System.out.println("部分: " + part);
        }
        
        // 格式化
        String formatted = String.format("Name: %s, Age: %d", "John", 25);
        System.out.println("格式化: " + formatted);
    }
}

2. StringBuilder类

StringBuilder是可变的,适合字符串拼接操作:

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        
        // 追加
        sb.append("Hello");
        sb.append(" ");
        sb.append("World");
        System.out.println("追加后: " + sb.toString());
        
        // 插入
        sb.insert(5, ",");
        System.out.println("插入后: " + sb.toString());
        
        // 删除
        sb.delete(5, 6);
        System.out.println("删除后: " + sb.toString());
        
        // 替换
        sb.replace(6, 11, "Java");
        System.out.println("替换后: " + sb.toString());
        
        // 反转
        sb.reverse();
        System.out.println("反转后: " + sb.toString());
        
        // 性能测试
        long startTime = System.currentTimeMillis();
        String result = "";
        for (int i = 0; i < 10000; i++) {
            result += "a";  // 低效
        }
        long endTime = System.currentTimeMillis();
        System.out.println("String拼接耗时: " + (endTime - startTime) + "ms");
        
        startTime = System.currentTimeMillis();
        StringBuilder sb2 = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            sb2.append("a");  // 高效
        }
        result = sb2.toString();
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder拼接耗时: " + (endTime - startTime) + "ms");
    }
}

3. StringBuffer类

StringBuffer是线程安全的,适合多线程环境:

public class StringBufferExample {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        
        // 线程安全的操作
        synchronized (sb) {
            sb.append("Hello");
            sb.append(" ");
            sb.append("World");
        }
        
        System.out.println("StringBuffer: " + sb.toString());
        
        // StringBuilder vs StringBuffer
        // StringBuilder:非线程安全,性能更高
        // StringBuffer:线程安全,性能稍低
    }
}

4. 字符串与基本类型转换

public class StringConversionExample {
    public static void main(String[] args) {
        // 基本类型转字符串
        int num = 123;
        String numStr = String.valueOf(num);
        System.out.println("int转String: " + numStr);
        
        double d = 3.14;
        String dStr = String.valueOf(d);
        System.out.println("double转String: " + dStr);
        
        boolean b = true;
        String bStr = String.valueOf(b);
        System.out.println("boolean转String: " + bStr);
        
        // 字符串转基本类型
        String str = "123";
        int n = Integer.parseInt(str);
        System.out.println("String转int: " + n);
        
        String dStr2 = "3.14";
        double d2 = Double.parseDouble(dStr2);
        System.out.println("String转double: " + d2);
        
        String bStr2 = "true";
        boolean b2 = Boolean.parseBoolean(bStr2);
        System.out.println("String转boolean: " + b2);
    }
}

5. 字符串格式化

public class StringFormattingExample {
    public static void main(String[] args) {
        String name = "John";
        int age = 25;
        double salary = 50000.50;
        
        // String.format()
        String formatted = String.format("Name: %s, Age: %d, Salary: %.2f", 
                                        name, age, salary);
        System.out.println(formatted);
        
        // 格式化说明符
        // %s - 字符串
        // %d - 整数
        // %f - 浮点数
        // %c - 字符
        // %b - 布尔值
        // %n - 换行符
        
        // System.out.printf()
        System.out.printf("Name: %s, Age: %d%n", name, age);
        
        // 格式化数字
        System.out.printf("工资: %,.2f%n", salary);
        
        // 格式化日期
        java.util.Date date = new java.util.Date();
        System.out.printf("日期: %tF%n", date);
    }
}

6. 正则表达式

public class RegularExpressionExample {
    public static void main(String[] args) {
        String text = "Hello123 World456 Java789";
        
        // 匹配
        boolean matches = text.matches(".*\\d+.*");
        System.out.println("包含数字: " + matches);
        
        // 查找
        java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\\d+");
        java.util.regex.Matcher matcher = pattern.matcher(text);
        
        while (matcher.find()) {
            System.out.println("找到数字: " + matcher.group());
        }
        
        // 替换
        String replaced = text.replaceAll("\\d+", "#");
        System.out.println("替换后: " + replaced);
        
        // 分割
        String[] parts = text.split("\\s+");
        for (String part : parts) {
            System.out.println("部分: " + part);
        }
    }
}

7. 实际应用示例

字符串反转

public class ReverseStringExample {
    public static String reverse(String str) {
        return new StringBuilder(str).reverse().toString();
    }
    
    public static void main(String[] args) {
        String original = "Hello World";
        String reversed = reverse(original);
        System.out.println("反转前: " + original);
        System.out.println("反转后: " + reversed);
    }
}

回文判断

public class PalindromeExample {
    public static boolean isPalindrome(String str) {
        String clean = str.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
        return clean.equals(new StringBuilder(clean).reverse().toString());
    }
    
    public static void main(String[] args) {
        System.out.println("racecar: " + isPalindrome("racecar"));
        System.out.println("hello: " + isPalindrome("hello"));
        System.out.println("A man a plan a canal Panama: " + isPalindrome("A man a plan a canal Panama"));
    }
}

最佳实践

  1. 使用StringBuilder:字符串拼接操作优先使用StringBuilder
  2. 使用StringBuffer:多线程环境使用StringBuffer
  3. 使用equals()比较:不要使用==比较字符串内容
  4. 避免空指针:使用前检查字符串是否为null
  5. 使用常量池:优先使用字面量创建字符串

总结

Java字符串处理是编程中的基础技能。String、StringBuilder和StringBuffer各有特点,要根据具体需求选择合适的字符串处理方式。掌握字符串操作方法对于编写高效的Java程序非常重要。