Java基础-StringBuffer类与StringBuilder类简介
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.StringBuffer类
在学习过String类之后,我们发现该类功能甚是强大。查看过API的小伙伴应该知道字符串缓冲区支持可变的字符串,说你是字符串缓冲区呢?接下来我们来研究一下字符串缓冲区。
String在存储数据时,过于浪费内存,因此诞生了StringBuffer类,它是一个类似于 String
的字符串缓冲区,但不能修改。我们可以通过下图看出,若要新生成一个字符串“res”时,需要在堆内存中创建出"yinzhengjie"和"M19"的内存对象,而最终有用的只有最后审查的字符串“yinzhengjieM19”有用,也就是res变量。而我们如果创建了StringBuffer对象之后,会明显发现存储之前的字符串始终只用了一块内存空间,当内存的值未满时,就会一直填充,而创建的对象也就始终只有它一个(一个StringBuffer默认字符缓冲区是16个字符)。
二.StringBuffer类常用的方法
1>.append方法
通过查阅相关API说明文档,可以说是StringBuffer对象的append方法可以将任意类型的数据,添加到缓冲区。接下来我们可以一起看个案例:
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.Demo; 8 9 public class StringBufferDemo { 10 11 public static void main(String[] args) { 12 function(); 13 } 14 15 public static void function() { 16 StringBuffer buffer = new StringBuffer(); 17 //调用StringBuffer方法append向缓冲区追加内容 18 buffer.append(6).append(false).append('A').append(3.14); 19 System.out.println(buffer); 20 } 21 } 22 23 24 25 /* 26 以上代码执行结果如下: 27 6falseA3.14 28 */
2>.delete方法
删除缓冲区字符,要注意的是里面需要传入2个值,delete(int start,int end),开始索引包含,结尾索引不包含。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.Demo; 8 9 public class StringBufferDemo { 10 11 public static void main(String[] args) { 12 function(); 13 } 14 15 public static void function() { 16 StringBuffer buffer = new StringBuffer(); 17 //调用StringBuffer方法append向缓冲区追加内容 18 buffer.append("yinzhengjie@2018"); 19 System.out.printf("buffer里面的内容是:[%s] ",buffer); 20 System.out.printf("长度是:[%d] ",buffer.length()); 21 //删除的起始位置是11,结束位置是16的索引下标 22 buffer.delete(11, 16); 23 System.out.printf("buffer里面的内容是:[%s] ",buffer); 24 //清空StringBuffer对象的所有内容 25 System.out.printf("长度是:[%d] ",buffer.length()); 26 buffer.delete(0, buffer.length()); 27 System.out.printf("buffer里面的内容是:[%s] ",buffer); 28 System.out.printf("长度是:[%d] ",buffer.length()); 29 30 31 } 32 } 33 34 35 36 /* 37 以上代码执行结果如下: 38 buffer里面的内容是:[yinzhengjie@2018] 39 长度是:[16] 40 buffer里面的内容是:[yinzhengjie] 41 长度是:[11] 42 buffer里面的内容是:[] 43 长度是:[0] 44 */
3>.insert方法
将任意数据类型,插入到缓冲区的指定索引上。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.Demo; 8 9 public class StringBufferDemo { 10 11 public static void main(String[] args) { 12 function(); 13 } 14 15 public static void function() { 16 StringBuffer buffer = new StringBuffer(); 17 //调用StringBuffer方法append向缓冲区追加内容 18 buffer.append("yinzhengjie@2018"); 19 System.out.printf("buffer里面的内容是:[%s] ",buffer); 20 System.out.printf("长度是:[%d] ",buffer.length()); 21 buffer.insert(3, "尹"); 22 buffer.insert(9, "正"); 23 buffer.insert(13, "杰"); 24 System.out.printf("buffer里面的内容是:[%s] ",buffer); 25 System.out.printf("长度是:[%d] ",buffer.length()); 26 } 27 } 28 29 30 31 /* 32 以上代码执行结果如下: 33 buffer里面的内容是:[yinzhengjie@2018] 34 长度是:[16] 35 buffer里面的内容是:[yin尹zheng正jie杰@2018] 36 长度是:[19] 37 */
4>.reverse() 将缓冲区中的字符反转
将缓冲区中的字符反转。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.Demo; 8 9 public class StringBufferDemo { 10 11 public static void main(String[] args) { 12 function(); 13 } 14 15 public static void function() { 16 StringBuffer buffer = new StringBuffer(); 17 //调用StringBuffer方法append向缓冲区追加内容 18 buffer.append("yinzhengjie@2018"); 19 System.out.printf("buffer里面的内容是:[%s] ",buffer); 20 System.out.printf("长度是:[%d] ",buffer.length()); 21 buffer.reverse(); 22 System.out.printf("buffer里面的内容是:[%s] ",buffer); 23 System.out.printf("长度是:[%d] ",buffer.length()); 24 } 25 } 26 27 28 29 /* 30 以上代码执行结果如下: 31 buffer里面的内容是:[yinzhengjie@2018] 32 长度是:[16] 33 buffer里面的内容是:[8102@eijgnehzniy] 34 长度是:[16] 35 36 */
5>.toSting()方法
该方法是继承Object,重写toString(),将缓冲区中的所有字符,变成字符串。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.Demo; 8 9 public class StringBufferDemo { 10 11 public static void main(String[] args) { 12 function(); 13 } 14 15 public static void function() { 16 StringBuffer buffer = new StringBuffer(); 17 //调用StringBuffer方法append向缓冲区追加内容 18 buffer.append("yinzhengjie@2018"); 19 System.out.printf("buffer里面的内容是:[%s] ",buffer); 20 System.out.printf("长度是:[%d] ",buffer.length()); 21 //将可变的字符串缓冲区对象,变成了不可变String对象。 22 String res = buffer.toString(); 23 System.out.printf("res里面的内容是:[%s] ",res); 24 System.out.printf("长度是:[%d] ",buffer.length()); 25 26 } 27 } 28 29 30 31 /* 32 以上代码执行结果如下: 33 buffer里面的内容是:[yinzhengjie@2018] 34 长度是:[16] 35 res里面的内容是:[yinzhengjie@2018] 36 长度是:[16] 37 */
二.StringBuilder类
一个可变的字符序列。此类提供一个与 StringBuffer
兼容的 API,但不保证同步。该类被设计用作 StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer
要快。 在后面我们分享网络编程的时候会给大家详解,到时候你就会明白为什么线程越安全速度越慢,而StringBuilder是线程不安全的类。
很显然,StringBuilder的所有方法,在StringBuffer中都是存在的。因为他们是兼容的。
三.小试牛刀
1>.存在数组"int[] arr = {11,22,33,44,6,8,4};",请将该数组元素全部转换成字符串,最终打印格式为:"[11,22,33,44,6,8,4]".

1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.Demo; 8 9 public class StringBufferDemo { 10 11 public static void main(String[] args) { 12 int[] arr = {11,22,33,44,6,8,4}; 13 StringBuffer res = function(arr); 14 System.out.println(res); 15 } 16 17 public static StringBuffer function(int[] arr) { 18 StringBuffer buffer = new StringBuffer(); 19 buffer.append("["); 20 for (int i = 0; i < arr.length; i++) { 21 if(i==arr.length-1) { 22 buffer.append(arr[i]).append("]"); 23 }else { 24 buffer.append(arr[i]).append(","); 25 } 26 } 27 return buffer; 28 } 29 } 30 31 32 33 /* 34 以上代码执行结果如下: 35 buffer里面的内容是:[yinzhengjie@2018] 36 长度是:[16] 37 res里面的内容是:[yinzhengjie@2018] 38 长度是:[16] 39 */