String类:底层使用char[]
l 常量对象:字符串常量对象是用双引号括起的字符序列
l 字符串的字符使用Unicode字符编码,一个字符占两个字节
l String类较常用构造方法:
- String s1 = new String();
- String s2 = new String(String original);
- String s3 = new String(char[] a);
- String s4 = new String(char[] a,int startIndex,int count)
String str = “abc”; 与 String str1 = new String(“abc”); 的区别?
前者引用指向字符串常量池,后者引用指向堆空间新开辟的对象。
StringBuffer类:
l java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删。
l 很多方法与String相同,但StingBuffer是可变长度的
StringBuilder类:
l StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法也一样
- String:不可变字符序列
- StringBuffer:可变字符序列、效率低、线程安全
- StringBuilder(JDK1.5):可变字符序列、效率高、线程不安全
String使用陷阱:
string s="a"; //创建了一个字符串
s=s+"b"; //实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能
@Test public void test3() { String text = ""; long startTime = 0L; long endTime = 0L; StringBuffer buffer = new StringBuffer(""); StringBuilder builder = new StringBuilder(""); startTime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { buffer.append(String.valueOf(i)); } endTime = System.currentTimeMillis(); System.out.println("StringBuffer的执行时间:" + (endTime - startTime)); startTime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { builder.append(String.valueOf(i)); } endTime = System.currentTimeMillis(); System.out.println("StringBuilder的执行时间:" + (endTime - startTime)); startTime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { text = text + i; } endTime = System.currentTimeMillis(); System.out.println("String的执行时间:" + (endTime - startTime)); }
StringBuffer的执行时间:10 StringBuilder的执行时间:4 String的执行时间:1091