3. StringBuffer 是一个 final 类,不能被继承
StringBuffer 保存的是字符串变量,里面的值可以更改,不用每次更新地址,效率较高 // char[ ] value 放在堆中
// Constructor and Description StringBuffer() // 构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符 StringBuffer(CharSequence seq) // 构造一个字符串缓冲区,包含与指定的CharSequener相同的字符 StringBuffer(int capacity) // 构造一个其中不带字符,但具有指定初始容量的的字符串缓冲区,即对char[]大小进行指定 StringBuffer(String str) //// 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容StringBuffer 和 String 的相互转换
String s = "hello";方式一:
StringBuffer b1 = new StringBuffer(s);方式二:
StringBuffer b2 = new StringBuffer(); b2.append(s);StringBuffer ---> String
String s2 = b1.toString()方式二:
String s3 = new String(b1);
// 堆代码 duidaima.com StringBuffer append() // 增 StringBuffer delete(int start, int end) // 删 StringBuffer insert() // 插入 StringBuffer replace(int start, int end, String str) // 改 int indexOf(String str) // 查 int length() // 获取长度练习题
String str = null; StringBuffer sb = new StringBuffer(); sb.append(str); // 调用的AbstractStringBuilder的 appendNull方法 System.out.println(sb.length()); // 4 null --> value = {'n', 'u', 'l', 'l'} System.out.println(sb.capacity()); // 16 System.out.println(sb); StringBuffer sb1 = new StringBuffer(str); //NullPointerException super(str.length() + 16); System.out.println(sb1);
4. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用
String s = "a"; // 创建一个字符串 s += "b";实际上原来的 "a" 字符串对象已经丢弃了,现在又产生了一个字符串是 s + "b" (即"ab")。如果多次执行这些改变串内容的操作,会导致的大量副本字符串对象存在内存中,降低效率。如果这样的操作放到循环中,会极大的影响程序的性能==> 结论:如果我们对String做大量修改,不要使用String
long startTime = 0L; long endTime = 0L; // StringBuffer StringBuffer stringBuffer = new StringBuffer(""); startTime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { stringBuffer.append(String.valueOf(i)); } endTime = System.currentTimeMillis(); System.out.println("StringBuffer的执行时间:" + (endTime - startTime)); // StringBuilder StringBuilder stringBuilder = new StringBuilder(""); startTime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { stringBuilder.append(String.valueOf(i)); } endTime = System.currentTimeMillis(); System.out.println("StringBuilder的执行时间:" + (endTime - startTime)); //String String text = ""; startTime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { text += i; } endTime = System.currentTimeMillis(); System.out.println("String的执行时间:" + (endTime - startTime)); // StringBuffer的执行时间:5 //StringBuilder的执行时间:2 //String的执行时间:1463 // 测试结果:StringBuilder > StringBuffer > String