悠悠楠杉
深入解析JavaString类的核心方法:开发者必备指南
一、String类的本质特性
作为Java最基础的引用类型,String类的每个方法设计都体现着"不可变对象"的设计哲学。当我们调用"hello".concat(" world")
时,JVM并不会修改原字符串,而是创建新的String对象——理解这个特性是掌握所有方法的前提。
java
String s1 = "Java";
String s2 = s1.concat("Script"); // 新建对象"JavaScript"
System.out.println(s1); // 输出"Java"(原对象未改变)
二、核心方法全解析
2.1 基础查询方法
- length():返回Unicode代码单元数量
java "中文ABC".length(); // 返回5
- isEmpty():判断是否为空字符串(非null)
- charAt(int index):获取指定索引字符(注意越界风险)
实际开发中建议优先使用StringUtils.isEmpty()
(Apache Commons)进行更安全的判空。
2.2 字符串比较
- equals(Object obj):内容比较(区分大小写)
- equalsIgnoreCase():忽略大小写比较
- compareTo():按字典序比较(返回正负零)
特别注意:==
比较的是对象地址,新手常踩的坑:
java
String a = "hi";
String b = new String("hi");
a.equals(b); // true
a == b; // false
2.3 字符串查找
- indexOf():正向查找字符/子串
- lastIndexOf():逆向查找
- contains():判断子串存在性
- matches():正则表达式匹配
性能提示:简单查找优先用contains()
,复杂模式再用正则。
2.4 字符串截取
- substring(int begin):从指定位置截取
- substring(int begin, int end):区间截取(左闭右开)
重要注意点:JDK 7u6前后实现方式不同,早期版本会共享原char数组可能导致内存泄漏。
2.5 字符串转换
- toLowerCase()/toUpperCase():大小写转换
- trim():去除首尾空白(无法去除全角空格)
- strip()(JDK11+):增强版trim,支持Unicode空白
国际化场景推荐使用toLowerCase(Locale.ROOT)
避免土耳其语等特殊locale的问题。
三、进阶方法应用
3.1 字符串拼接
- concat():基础拼接方法
- join()(JDK8+): delimiter拼接集合元素
java String.join(",", "A", "B", "C"); // "A,B,C"
实际开发中,循环体内拼接字符串务必使用StringBuilder
。
3.2 格式化输出
- format():C风格格式化
java String.format("%04d", 25); // "0025"
- formatted()(JDK15+):实例方法版本
3.3 类型转换
- valueOf():将各种类型转为String
- getBytes():注意指定字符编码
java "测试".getBytes(StandardCharsets.UTF_8);
四、性能关键方法
4.1 字符串分割
- split():正则分割(性能敏感场景慎用)
java "a,b,c".split(",", 2); // 限制分割次数
高并发场景建议预编译Pattern:
java
private static final Pattern SPLITTER = Pattern.compile(",");
SPLITTER.split(str);
4.2 内存优化方法
- intern():将字符串放入常量池
java new String("test").intern(); // 可能返回常量池引用
注意:JDK7后常量池移至堆空间,过度使用可能适得其反。
五、新版特性(JDK11+)
- isBlank():检测空白字符(包括Unicode)
- lines():按行分割为Stream
- repeat(int):重复字符串
java "-".repeat(3); // "---"
- transform():函数式转换
java "hello".transform(s -> s + " world");
结语:String方法使用哲学
- 不变性原则:所有"修改"操作都返回新对象
- 编码一致性:始终明确字符编码(特别在IO操作时)
- 性能权衡:简单操作用String方法,复杂处理用StringBuilder
掌握这些方法背后的设计思想,比机械记忆API更重要。当你在IDE里输入str.
时自动弹出的方法列表,现在应该有了更深层次的理解。