Java基础-StringBuffer类与StringBuilder类简介

              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 */
本题的参考解法,本题的解法有很多种,答案不一致很正常,初学者实现效果就好!
原文地址:https://www.cnblogs.com/yinzhengjie/p/8850698.html