本文介绍了String类、StringBuffer类、StringBuilder类的区别和各自的使用方法。
String类:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 
 | public class StringDemo {public static void main(String[] args) {
 String s0 = "hello world";
 String s1 = "Hello world";
 String s2 = new String("Hello world");
 System.out.println(s1.equals(s2));
 System.out.println(s1 == s2);
 System.out.println(s0.equalsIgnoreCase(s1));
 
 String s3 = s1 + s2;
 System.out.println(s3);
 String s4 = s1.concat(s2);
 System.out.println(s4);
 
 String s5 = "aabytea";
 for(int i = 0; i < s5.length(); ++i){
 System.out.println(s5.charAt(i));
 }
 char[] arr = s5.toCharArray();
 String s6 = "aabytec";
 System.out.println(s5.compareTo(s6));
 String s7 = "abbccddeeffggabcd";
 
 
 System.out.println(s7.indexOf('c',0));
 
 System.out.println(s7.indexOf("abcd",0));
 System.out.println(s7.contains("abcd"));
 
 System.out.println(s7.lastIndexOf("dde"));
 System.out.println(s7.lastIndexOf('b'));
 System.out.println(s7.lastIndexOf('b',5));
 String s8 = "Java Php MySQL Java";
 String s9 = s8.replaceAll("Java","Python");
 System.out.println(s9);
 System.out.println(s8.startsWith("Java"));
 System.out.println(s8.endsWith("Java"));
 String s10 = "abcdefghiJKLMN";
 System.out.println(s10.substring(2,8));
 System.out.println(s10.toUpperCase());
 System.out.println(s10.toLowerCase());
 
 String str1 = "Tom,Lily,Jerry,Lucy,Kyle";
 String[] strArr = str1.split(",");
 for(String s : strArr){
 System.out.println(s);
 }
 
 String str2 = str1.replace("Tom","John");
 System.out.println(str1);
 System.out.println(str2);
 String str3 = "abcdeabcde123456789";
 String str4 = str3.replaceAll("a","MMM");
 System.out.println(str4);
 String str5 = str3.replaceAll("\\d","*");
 System.out.println(str5);
 String str6 = str3.replaceAll("\\w","*");
 System.out.println(str6);
 
 String str7 = "   Java   \n";
 System.out.println(str7);
 System.out.println(str7.trim());
 
 System.out.println(str7.replaceAll("\\s",""));
 
 String numStr1 = "1234";
 int num1 = Integer.parseInt(numStr1);
 String numStr2 = "564.45";
 double num2 = Double.parseDouble(numStr2);
 System.out.println(num1 + num2);
 Integer n = Integer.valueOf(numStr1);
 String numStr3 = Integer.toString(n);
 System.out.println(numStr3);
 }
 }
 
 | 
StringBuffer类:
- StringBuffer类是对String类的增强,它还是lang包中的,即java.lang.StringBuffer类。
- StringBuffer类代表可变的字符串,可以对字符串的内容进行增删。
- StringBuffer类的很多方法都与String类相同,只不过StringBuffer是可变长度的。
- StringBuffer是一个容器。
- StringBuffer是final类,不能被继承。
常用方法:
| 方法 | 功能 | 
| public StringBuffer append(String str) | 将指定的字符串追加到此字符序列 | 
| public StringBuffer delete(int start, int end) | 移除此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符,如果不存在这种字符,则一直到序列尾部。如果 start 等于 end,则不发生任何更改 | 
| public StringBuffer replace(int start,int end,String str) | 使用给定 String 中的字符替换此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符,如果不存在这种字符,则一直到序列尾部。先将子字符串中的字符移除,然后将指定的 String 插入 start。(如果需要,序列将延长以适应指定的字符串) | 
| public int indexOf(String str) | 返回第一次出现的指定子字符串在该字符串中的索引 | 
| public StringBuffer insert(int offset, String str) | 将字符串插入此字符序列中。 按顺序将 String 参数中的字符插入此序列中的指定位置,将该位置处原来的字符向后移,此序列将增加该参数的长度。如果 str 为 null,则向此序列中追加 4 个字符 “null” | 
| public char charAt(int index) | 返回此序列中指定索引处的 char 值。第一个 char 值在索引 0 处,第二个在索引 1 处,依此类推,这类似于数组索引。 index 参数必须大于等于 0,且小于此序列的长度 | 
| public int length() | 返回长度(字符数)不是容量 | 
代码演示:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | public class StringBufferDemo {public static void main(String[] args) {
 
 StringBuffer s = new StringBuffer("aabyteMMMM");
 
 s.append("000");
 s.append("Lucy").append(100).append(true).append(10.5);
 System.out.println(s);
 
 
 
 s.delete(8, 13);
 System.out.println(s);
 
 
 s.replace(2, 5, "MySQL");
 System.out.println(s);
 
 
 int indexOf = s.indexOf("Lucy");
 System.out.println(indexOf);
 
 
 s.insert(9, "JAVA");
 System.out.println(s);
 
 
 System.out.println(s.length());
 System.out.println(s);
 
 
 System.out.println(s.charAt(0));
 }
 }
 
 | 
运行结果:
| 12
 3
 4
 5
 6
 7
 8
 
 | aabyteMMMM000Lucy100true10.5aabyteMMLucy100true10.5
 aaMySQLeMMLucy100true10.5
 10
 aaMySQLeMJAVAMLucy100true10.5
 29
 aaMySQLeMJAVAMLucy100true10.5
 a
 
 | 
StringBuilder类:
- StringBuilder 类保存了一个可变的字符序列。此类提供了一个与 StringBuffer 类兼容的API。该类被设计用作 StringBuffer 类的一个简易替换,用在字符串缓冲区被单个线程使用的时候。 
- StringBuilder 类不保证同步(即不是线程安全的),但它要比StringBuffer 类的速度快,在单线程中,优先使用该类。 
- StringBuilder 类的直接父类 是 AbstractStringBuilder 类。 
- StringBuilder 实现了 Serializable 接口,代表了 StringBuffer 类的对象可以串行化【即可以进行网络编程】。 
- 在父类 AbstractStringBuilder 中包含属性 char[] value,没有 final 修饰(与 String 类不同),因此该 value 数组存储字符串的位置在堆内存中,而不是在方法区的常量池中。 
- StringBuilder 类是一个 final 类,不能被继承。 
- 因为StringBuilder 类对象的字符序列是存储在 char[] value 属性中的,所以在改变字符序列时(增加/删除), 不用每次都更换对象地址(即不是每次创建新对象), 因此其效率高于 String 类。 
- StringBuilder 类没有实现多线程同步(即它不是线程安全的)。 
String、StringBuffer 和 StringBuilder 的比较:
- StringBuilder和StringBuffer非常类似,均代表可变的字符序列,而且方法也一样。
- String: 不可变字符序列,效率低,但是复用率高。
- StringBuffer: 可变字符序列、效率较高(增删)、线程安全。
- StringBuilder: 可变字符序列、效率最高、但线程不安全。
- 每次对String进行拼接操作时,都会产生一个新的对象,随着操作次数增多,会严重影响程序性能。
代码演示:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 
 | public class StringBuilderDemo {public static void main(String[] args) {
 
 StringBuilder s = new StringBuilder("aabyteMMMM");
 
 s.append("000");
 s.append("Lucy").append(100).append(true).append(10.5);
 System.out.println(s);
 
 
 
 s.delete(8, 13);
 System.out.println(s);
 
 
 s.replace(2, 5, "MySQL");
 System.out.println(s);
 
 
 int indexOf = s.indexOf("Lucy");
 System.out.println(indexOf);
 
 
 s.insert(9, "JAVA");
 System.out.println(s);
 
 
 System.out.println(s.length());
 System.out.println(s);
 
 
 System.out.println(s.charAt(0));
 }
 }
 
 | 
- 字符串存在大量修改操作 + 单线程情况  =  推荐使用StringBuilder
- 字符串存在大量修改操作 + 多线程情况  =  推荐使用StringBuffer
- 字符串很少修改 + 被多个对象引用 = 推荐使用String