在 Java 开发中,工具类是提升效率的 “利器”。其中,String、StringBuilder和Arrays是日常编码中使用频率最高的工具类,掌握它们的核心用法能帮我们避开很多坑,写出更高效的代码。本文将通过实战案例,详细解析这三个工具类的常用方法和最佳实践。
一、String 类:不可变字符串的 “正确打开方式”
String是 Java 中最基础的类之一,用于处理字符串。但很多新手容易忽略一个关键点:String 对象是不可变的(底层用final char[]存储),任何修改操作都会创建新的对象。这一特性决定了它的使用场景和注意事项。
1. 常用方法实战
字符串比较:equals() vs ==
新手常犯的错误是用==比较字符串内容,实际上==比较的是对象地址,而equals()才是比较内容。
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)
字符串查找与截取
String url = "https://blog.youkuaiyun.com";
int index = url.indexOf("csdn"); // 返回12
String domain = url.substring(8, 19); // 结果为"blog.youkuaiyun.com"
- indexOf(String str):返回子串首次出现的索引(找不到返回 - 1);
- substring(int beginIndex, int endIndex):截取子串(左闭右开区间)。
字符串转换
String str = " Hello World ";
System.out.println(str.trim().toLowerCase()); // "hello world"
String[] parts = "a,b,c".split(","); // 结果为["a", "b", "c"]
- toUpperCase()/toLowerCase():大小写转换;
- trim():去除首尾空格(注意:无法去除中间空格);
- split(String regex):按正则分割字符串(常用场景:分割逗号、空格等)。
2. 避坑指南
- 避免频繁拼接字符串:由于不可变性,s += "a"会创建多个中间对象,性能较差(此时应改用StringBuilder);
- 注意null值:调用null.equals(s)会抛NullPointerException,建议写成s.equals(null)或用Objects.equals(s1, s2)(JDK 7+)。
二、StringBuilder:高效处理可变字符串
当需要频繁修改字符串(如拼接、插入、删除)时,StringBuilder是更好的选择。它是可变的(底层也是char[],但可动态扩容),所有操作都在原对象上进行,性能远高于String。
1. 核心方法实战
拼接字符串:append()
支持拼接任意类型数据(字符串、数字、布尔值等),返回自身对象,可链式调用。
StringBuilder sb = new StringBuilder();
sb.append("姓名:").append("张三").append(",年龄:").append(20);
System.out.println(sb.toString()); // 结果:"姓名:张三,年龄:20"
插入与删除
StringBuilder sb = new StringBuilder("abcde");
sb.insert(2, "xyz"); // 结果:"abxyzcde"
sb.delete(2, 5); // 结果:"abcde"(删除"xyz")
- insert(int offset, String str):在指定位置插入字符串;
- delete(int start, int end):删除指定区间的字符(左闭右开)。
反转字符串:reverse()
一行代码实现字符串反转,无需手动写循环。
String reversed = new StringBuilder("hello").reverse().toString(); // 结果:"olleh"
2. 与 StringBuffer 的区别
StringBuffer是StringBuilder的 “线程安全版”,所有方法都加了synchronized锁,但性能较低。日常开发中,若无需线程安全,优先用StringBuilder。
三、Arrays:数组操作的 “全能工具”
Arrays类提供了大量静态方法,用于数组的排序、查找、拷贝、填充等操作,避免了我们重复编写工具代码。
1. 常用方法实战
数组排序:sort()
对数组进行自然排序(升序),支持基本类型和对象数组(对象需实现Comparable接口)。
int[] nums = {3, 1, 4, 2};
Arrays.sort(nums); // 排序后:[1, 2, 3, 4]
String[] names = {"Bob", "Alice", "Charlie"};
Arrays.sort(names); // 按字母顺序排序:["Alice", "Bob", "Charlie"]
数组查找:binarySearch()
二分查找指定元素的索引(使用前必须先排序,否则结果不可靠)。
int[] nums = {1, 2, 3, 4};
int index = Arrays.binarySearch(nums, 3); // 返回2(找到)
int notFound = Arrays.binarySearch(nums, 5); // 返回-5(-插入点-1)
- 数组拷贝:copyOf() 与 arraycopy()
- copyOf(原数组, 新长度):创建新数组并拷贝元素(超出原长度则补默认值);
- arraycopy(原数组, 原起始索引, 目标数组, 目标起始索引, 拷贝长度):在已有数组间拷贝(更灵活)。
数组转集合:asList()
将数组转为List(注意:返回的是固定长度的ArrayList,不支持add/remove操作)。
List<String> list = Arrays.asList("a", "b", "c");
// list.add("d"); // 抛UnsupportedOperationException
四、实战案例:综合运用三个工具类
下面通过一个 “手机号脱敏” 案例,展示三个工具类的协同使用:
需求:将手机号13812345678处理为138****5678。
public class StringDemo {
public static void main(String[] args) {
String phone = "13812345678";
// 1. 用String截取前3位和后4位
String prefix = phone.substring(0, 3);
String suffix = phone.substring(7);
// 2. 用StringBuilder拼接
StringBuilder masked = new StringBuilder();
masked.append(prefix).append("****").append(suffix);
System.out.println(masked.toString()); // 输出:138****5678
}
}
总结
- String适合处理固定不变的字符串,注意避免频繁修改;
- StringBuilder适合动态拼接字符串,性能优于String;
- Arrays简化数组操作,排序、查找、拷贝等场景优先使用。
掌握这三个工具类的核心方法,能让我们的代码更简洁、高效。建议多动手练习,结合实际场景灵活运用,才能真正内化这些知识。