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线程不安全,效率高
-

浙公网安备 33010602011771号