JavaEE-13-Java中的StringBuffer类和StringBuilder类
StringBuffer概述:
前面我们讲过Stringr的两种拼接方法:1.使用符号“+”; 2.使用方法concat(String str).
但是,使用这两种方法进行拼接都会生成一个新的String对象,既耗时,又浪费空间。
而StringBuffer就可以解决这个问题,因为它是线程安全的可变字符串。
构造方法:
StringBuffer():无参构造方法
StringBuffer(int capacity):指定容量的字符串缓冲区对象
StringBuffer(String str):指定字符串内容的字符串缓冲区对象
常用方法:
int capacity():返回当前容量 ---理论值
int length():返回长度(字符数) ---实际值
示例:以下是创建StringBuffer 3种方法(一般使用第一种)
StringBuffer sb=new StringBuffer();
System.out.println(sb.capacity()); //调用无参构造函数,int的默认长度为16
System.out.println(sb.length()); //无字符串,故长度为0
StringBuffer sb2=new StringBuffer(50);
System.out.println(sb2.capacity()); //调用指定容量构造函数,长度为指定长度50
System.out.println(sb2.length()); //无字符串,故长度还是0
StringBuffer sb3=new StringBuffer("hello");
System.out.println(sb3.capacity()); //调用指定字符串构造函数,长度为(默认长度16)+(指定的字符串长度5)=21
System.out.println(sb3.length()); //字符串长度为5,故长度为5
特有功能:
添加功能:
StringBuffer append(String str):可以把任意类型添加到字符串缓冲区中,并返回字符串缓冲区本身
StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入字符串缓冲区中,并返回字符串缓冲区本身
删除功能:
StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回字符本身。
StringBuffer delete(int start, int end):删除从起始位置到结束位置的字符。(Java中的所有范围方法都是包左不包右,即包含起始位置不包含结束位置)
替换功能:
StringBuffer replace(int start,int end,String str):使用指定字符串替换起始位置到结束位置的字符。
反转功能:
StringBuffer reverse():将字符串反转
截取功能:注意返回值,上面的4个功能返回的都是字符串本身,但截取返回值不是字符串本身
StringBuffer substring(int start):截取指定位置开始到结尾的字符
StringBuffer substring(int start,int end):截取指定位置开始到指定位置结束的字符
StringBuffer与String之间的转换
1.String对象转成 StringBuffer对象:
String是字符串类,所以可以直接将字符串赋值给它,比如:
String s = "hello";
但StringBuffer不能直接赋值字符串给它,因为它只是一个字符串的缓冲区,
通过看其构造函数,我们发现赋值字符串有以下两种方法:
1).使用第一种构造函数,先构造一下空的对象,再使用append()方法
StringBuffer sb = new StringBuffer();
sb.append("hello");
2).使用第三种构造函数,用指定字符串来构造字符串缓冲区
StringBuffer sb = new StringBuffer("hello");
2.StringBuffer对象转成String对象,也是有两种方法(一般用第二种方法):
1).通过构造方法
StringBuffer buffer = new StringBuffer("java");
String str = new String(buffer);
2).通过tostring()方法
String str2 = buffer.toString();
示例:把数组的内容拼接成一个字符串
1 public class StringBufferTest2 { 2 public static void main(String[] args) { 3 int[] arr = { 44, 33, 55, 11, 22 }; 4 5 // 方式1:用String的"+"拼接,开辟的内存空间很多,所以效率很低 6 System.out.println(arrayToString(arr)); 7 // 方式2:用StringBuffer拼接 8 System.out.println(arrayToString2(arr)); 9 } 10 11 public static String arrayToString(int[] arr) { 12 String s = ""; 13 14 s += "["; 15 for (int x = 0; x < arr.length; x++) { 16 if (x == arr.length - 1) { 17 s += arr[x]; 18 s += "]"; 19 } else { 20 s += arr[x]; 21 s += ","; 22 } 23 } 24 return s; 25 } 26 27 public static String arrayToString2(int[] arr) { 28 StringBuffer sb = new StringBuffer(); 29 sb.append("["); 30 for (int x = 0; x < arr.length; x++) { 31 if (x == arr.length - 1) { 32 sb.append(arr[x]); 33 sb.append("]"); 34 } else { 35 sb.append(arr[x]); 36 sb.append(","); 37 } 38 } 39 return sb.toString(); 40 } 41 }
上面的代码分别使用了String和StingBuffer两种方法,通过代码我们可以看出,
使用String方法时会开辟更多的内存空间,导致效率低下,故我们一般会使用第二种方法.
StringBuilder类
一个可变的字符序列,此类提供一个与StringBuffer兼容的API,但不保证同步。
该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。
所以StringBuilder比StringBuffer更快,效率更高,建议优先采用此类。
String,StringBuffer,StringBuilder三者之间的区别
1.内容可变性
String是内容不可变的,StringBuffer和StringBuilder都是内容可变的。
注:String在系统内存中存储的是一个值,无论方法怎么调用,这个值都是不会变的。
而StringBuffer在内存中存储的是一个地址引用,一旦调用的方法给该引用的地址赋予了新的值,原对象就会发生改变。
举例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class StringBufferDemo { public static void main(String[] args) { String s1 = "hello"; String s2 = "world"; System.out.println(s1 + "---" + s2); change(s1, s2); System.out.println(s1 + "---" + s2);//不改变原值 StringBuffer sb1 = new StringBuffer("hello"); StringBuffer sb2 = new StringBuffer("world"); System.out.println(sb1+"---"+sb2); change(sb1, sb2); System.out.println(sb1+"---"+sb2);//改变原值 } public static void change(String s1, String s2) { s1 = s2; s2 = s1 + s2; } private static void change(StringBuffer sb1,StringBuffer sb2) { sb1=sb2; sb2.append(sb1); } }
2.同步性
StringBuffer是同步的,数据安全,但效率低
StringBuilder是不同步的,数据不安全,但效率高
注:以上所说的数据安全指的是多线程的情况下,一般我们的使用场景都是单线程的,所以StringBuilder更常用。
StringBuffer和数组的区别
二者都可以看成是一个容器,装其他的数据
但是,StringBuffer的数据最终是一个字符串数据。
而数组可以放置多种数据,只是每次放置的必须是同一种数据类型的。