2022.4.21 常用类 StringBuffer与StringBuilder

StringBuffer

String在频繁拼接的场景是不推荐使用,因为这种情况下会在方法区中开辟很多空间,浪费资源,面对这种情况我可以使用StringBuffer或者StringBuilder来解决这种问题

StringBuffer:线程安全的可变字符序列。一个类似于 string 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

构造方法

1  StringBuffer() 
2  构造一个没有字符的字符串缓冲区,初始容量为16个字符。  
3  StringBuffer(CharSequence seq) 
4  构造一个包含与指定的相同字符的字符串缓冲区 CharSequence 。  
5  StringBuffer(int capacity) 
6  构造一个没有字符的字符串缓冲区和指定的初始容量。  
7  StringBuffer(String str) 
8  构造一个初始化为指定字符串内容的字符串缓冲区。  
 
 1  package com.xing.StringBuffer;
 2  3  public class Demo01 {
 4      public static void main(String[] args) {
 5          //创建了一个默认容量为16的字符数组
 6          StringBuffer s1 = new StringBuffer();
 7          System.out.println(s1.capacity());//16
 8  9 10          StringBuffer s2 = new StringBuffer('a');//参数会转化为int类型
11          System.out.println(s2.capacity());//97
12          System.out.println(s2.toString());//
13          //构造一个没有字符的字符串缓冲区和指定的初始容量。
14          StringBuffer s3 = new StringBuffer(30);
15          System.out.println(s3.capacity());//30
16 17          //构造一个初始化为指定字符串内容的字符串缓冲区。
18          StringBuffer s4 = new StringBuffer("hello");
19          System.out.println(s4.capacity());//21   初始容量16+字符串长度
20          System.out.println(s4.toString());//hello
21 22      }
23  }

 1 append(boolean b)将boolean参数的字符串表示形式追加到序列。
 2 append(char c)将char参数的字符串表示形式追加到此序列。
 3 append(char[]str)将char数组参数的字符串表示形式追加到此序列。
 4 append(char[]str,int offset,int len)将char数组参数的子数组的字符串表示形式追加到此序列。
 5 append(double d)将double参数的字符串表示形式追加到此序列。
 6 append(float f)将float参数的字符串表示形式追加到此序列。
 7 append(int i)将int参数的字符串表示形式追加到此序列。
 8 append (long lng)将long参数的字符串表示形式追加到此序列。
 9 append(Object obj)追加Object参数的字符串表示形式。            
10 append(String str)待指定的字符串追加到此字符序列。
11 append(CharSequence s)将指定的CharSequence 追加到该序列。
12 append(CharSequences,intstart, intend)将指定CharSequence的子序列追加到此序列。
13 insert(4,"你好呀")从下标4开始插入
14 deleteCharAt(4)移除下标为4的字符
15 delete(4,5)从下标4开始移除到下标5 (左闭右开)
16 replace(0, 4, "x")从下标0到下标4 (左闭右开)的字符串替换为x
 1 package com.xing.StringBuffer;
 2 
 3 public class Demo02 {
 4     public static void main(String[] args) {
 5         StringBuffer s1 = new StringBuffer();
 6 
 7         //append追加字符串
 8         s1.append("hello");
 9         s1.append("111");
10         s1.append("aaa");
11         System.out.println(s1.toString());//hello111aaa
12         //链式写法
13         s1.append("a").append("b");
14         System.out.println(s1.toString());//hello111aaaab
15 
16         //从下标4开始插入
17         s1.insert(4,"你好呀");
18         System.out.println(s1.toString());//hell你好呀o111aaaab
19 
20         //移除下标为4的字符
21         s1.deleteCharAt(4);
22         System.out.println(s1.toString());//hell好呀o111aaaab
23 
24         //从下标4开始移除到下标5 (左闭右开)
25         s1.delete(4,5);
26         System.out.println(s1.toString());//hell呀o111aaaab
27 
28         //替换   从下标0到下标4 (左闭右开)的字符串替换为x
29         s1.replace(0, 4, "x");
30         System.out.println(s1.toString());//x呀o111aaaab
31 
32     }
33 }

 

反转字符串

 1 package com.xing.StringBuffer;
 2 
 3 public class Demo03 {
 4     public static void main(String[] args) {
 5         String s = "abcd";
 6         StringBuffer sb = new StringBuffer(s);
 7 
 8         sb.reverse();//反转
 9         System.out.println(sb.toString());
10 
11 //        System.out.println(sb.reverse().toString());
12     }
13 }

StringBuilder

一个可变的字符序列。此类提供一个与StringBuffer兼容的API(提供的方法大体相同),但不保证同步(线程可能不安全)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer要快。

 

经典面试题:

String,StringBuffer,StringBuilder的区别

  • String的特点:线程不安全,一旦在方法区创建就不会被更改,可以给多个引用共享,在做大量字符串拼接的时候效率很低

  • StringBuffer,StringBuilder 可以改变字符串的长度和内容,是一个字符串缓冲区,在做大量字符串拼接的时候不会开辟新的空间

  • StringBuffer和StringBuilder对比

    • StringBuffer线程安全,效率低

    • StringBuilder线程不安全,效率高

 

 

posted @ 2022-04-25 13:10  暴躁C语言  阅读(63)  评论(0)    收藏  举报