基础概念解析
不可变性
String 类由 final char[] 实现(JDK 8),修改操作实际生成新对象。示例展示字符串拼接时的对象新建过程:
String s = "a";
s += "b"; // 实际生成新对象,原对象未被修改
字符串常量池
直接赋值与 new String() 的内存差异需用代码对比:
String s1 = "abc"; // 常量池
String s2 = new String("abc"); // 堆内存
System.out.println(s1 == s2.intern()); // true
高频方法实战
方法讲解需包含功能说明、代码示例与注意事项。以 substring 为例:
public class StringDemo {
public static void main(String[] args) {
// 1. 字符串创建与常量池
String s1 = "hello";
String s2 = new String("hello");
System.out.println("s1 == s2: " + (s1 == s2)); // false
System.out.println("s1.equals(s2): " + s1.equals(s2)); // true
// 2. equals() vs equalsIgnoreCase()
String s3 = "Java";
String s4 = "java";
System.out.println("equals(): " + s3.equals(s4)); // false
System.out.println("equalsIgnoreCase(): " + s3.equalsIgnoreCase(s4)); // true
// 3. 字符串查找
String s5 = "Hello World";
System.out.println("contains(): " + s5.contains("World")); // true
System.out.println("indexOf(): " + s5.indexOf("o")); // 4
System.out.println("lastIndexOf(): " + s5.lastIndexOf("o")); // 7
// 4. 字符串截取
String s6 = "HelloWorld";
System.out.println("substring(5): " + s6.substring(5)); // World
System.out.println("substring(5,10): " + s6.substring(5,10)); // World
// 5. 字符串替换
String s7 = "a b c d";
System.out.println("replace(): " + s7.replace(" ", ",")); // a,b,c,d
System.out.println("replaceAll(): " + s7.replaceAll("\\s", ",")); // a,b,c,d
// 6. 字符串拆分
String s8 = "a,b,c";
String[] arr = s8.split(",");
System.out.println("split(): " + Arrays.toString(arr)); // [a, b, c]
// 7. 其他常用方法
String s9 = " trim ";
System.out.println("trim(): [" + s9.trim() + "]"); // [trim]
System.out.println("isEmpty(): " + "".isEmpty()); // true
System.out.println("length(): " + "Java".length()); // 4
// 8. StringBuilder vs String拼接效率对比
long startTime = System.currentTimeMillis();
String result = "";
for (int i = 0; i < 10000; i++) {
result += i;
}
long endTime = System.currentTimeMillis();
System.out.println("String拼接耗时: " + (endTime - startTime) + "ms");
startTime = System.currentTimeMillis();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder拼接耗时: " + (endTime - startTime) + "ms");
//9.字符串与数组的转换
String str="123";
//字符串 to 数组
str.toCharArray();//{'1','2','3'}
//数组 to 字符串
char[] charArray = {'J', 'a', 'v', 'a', ' ', 'Y', 'y', 'd'};
String str = new String(charArray);//Java Yyd
}
}
关键点标注参数范围规则(左闭右开),避免读者误用。
类对比与性能优化
通过表格明确三类差异:
| 类 | 线程安全 | 效率 | 典型场景 |
|---|---|---|---|
| String | 安全 | 低 | 静态字符串存储 |
| StringBuilder | 不安全 | 高 | 单线程字符串操作 |
| StringBuffer | 安全 | 中 | 多线程环境 |
性能对比示例:
// String拼接测试
long start = System.currentTimeMillis();
String result = "";
for (int i = 0; i < 10000; i++) {
result += i; // 每次循环新建对象
}
System.out.println("String耗时: " + (System.currentTimeMillis() - start));
常见问题与解决方案
==与equals误用
强调内容比较必须使用equals,并推荐空安全写法:Objects.equals(s1, s2); // 避免NullPointerException- 循环拼接性能问题
提供优化方案:StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); // 避免对象重复创建 }
1405

被折叠的 条评论
为什么被折叠?



