Java字符串详解:String、StringBuilder与StringBuffer
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"));
}
}
最佳实践
- 使用StringBuilder:字符串拼接操作优先使用StringBuilder
- 使用StringBuffer:多线程环境使用StringBuffer
- 使用equals()比较:不要使用==比较字符串内容
- 避免空指针:使用前检查字符串是否为null
- 使用常量池:优先使用字面量创建字符串
总结
Java字符串处理是编程中的基础技能。String、StringBuilder和StringBuffer各有特点,要根据具体需求选择合适的字符串处理方式。掌握字符串操作方法对于编写高效的Java程序非常重要。