Java高效编码:String、StringBuilder与Arrays实战

在 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简化数组操作,排序、查找、拷贝等场景优先使用。​

掌握这三个工具类的核心方法,能让我们的代码更简洁、高效。建议多动手练习,结合实际场景灵活运用,才能真正内化这些知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值