Java中String类有一个非常重要的特性:不可变(immutable)。简单来说,就是一旦创建了一个字符串对象,就无法更改它的内容。因为每次字符串内容的更改都会创建一个新的字符串对象,这样就会导致频繁的对象创建和垃圾回收,对应用的性能造成很大的影响。
一、StringBuilder类的介绍
StringBuilder类是Java提供的用于字符串操作的工具类。与String不同的是,StringBuilder类的实例内容可以改变,而且其操作是非常高效的。可以将StringBuilder看作是一个可变的字符序列,可以通过它进行字符串的追加、插入、删除等操作,如果一次性需要进行多次字符串拼接,建议使用StringBuilder。
二、StringBuilder与String的性能比较
下面通过一组程序来比较使用String和StringBuilder进行字符串拼接的性能差异:
public class StringTest { public static void main(String[] args) { long start = System.currentTimeMillis(); String s1 = ""; for (int i = 0; i < 10000; i++) { s1 = s1 + i; } long end = System.currentTimeMillis(); System.out.println("Using String cost " + (end - start) + "ms"); start = System.currentTimeMillis(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } end = System.currentTimeMillis(); System.out.println("Using StringBuilder cost " + (end - start) + "ms"); } }
运行结果如下:
Using String cost 1316ms Using StringBuilder cost 1ms
可以看到,使用String进行字符串拼接需要1316ms,而使用StringBuilder仅需要1ms。显然,使用StringBuilder的性能要优于String,尤其是在需要多次字符串拼接的情况下。
三、StringBuilder的常用方法
StringBuilder的常用方法如下:
- append(String str): 将指定的字符串追加到此字符序列。
- insert(int offset, String str): 将指定的字符串插入此字符序列中。
- delete(int start, int end): 移除此序列的子字符串中的字符。
- deleteCharAt(int index): 移除此序列指定位置上的字符。
- replace(int start, int end, String str): 使用指定的字符串替换此序列的子字符串中的字符。
- reverse(): 将此字符序列用其反转形式取代。
下面通过实例来演示这些方法的使用:
public class StringBuilderTest { public static void main(String[] args) { StringBuilder sb = new StringBuilder("hello"); System.out.println(sb.toString()); //hello sb.append(" world"); System.out.println(sb.toString());//hello world sb.insert(5, ","); System.out.println(sb.toString()); //hello, world sb.delete(5, 6); System.out.println(sb.toString()); //hello world sb.deleteCharAt(5); System.out.println(sb.toString()); //helloworld sb.replace(5, 8, "java"); System.out.println(sb.toString()); //hellojava sb.reverse(); System.out.println(sb.toString()); //avajolleh } }
运行结果如下:
hello hello world hello, world hello world helloworld hellojava avajolleh
四、总结
本文介绍了Java中StringBuilder类的使用方法,以及与String进行字符串拼接的性能比较。在实际开发中,如果需要多次进行字符串拼接操作,建议使用StringBuilder类,其性能远远高于String对象拼接。