StringBuffer类和StringBuilder类

缓冲区的概念:
本质就是数组
缓冲区的引入:
可以提高效率,减少每次创建对象消耗的时候,减少内存占用
池的设计
初始容量
最大容量
增量
最大空闲数
最小空闲数
等待时间
字符串缓冲区
字符串池
字符流缓冲池 数据库连接池 线程池…
StringBuffer
StringBuffer() :构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
StringBuffer(CharSequence seq):构造一个字符串缓冲区,它包含与指定CharSequence 相同的字符。
StringBuffer(int capacity) :构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。

public class StringBufferDemo01 {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
		System.out.println(sb);
		StringBuffer sb2 = new StringBuffer("abc");
		System.out.println(sb2);
		
		System.out.println(sb.length());
		System.out.println(sb.capacity());
		System.out.println(sb2.length());
		System.out.println(sb2.capacity());
		
		StringBuffer sb3 = new StringBuffer(30);
		System.out.println(sb3.length());
		System.out.println(sb3.capacity());
		
		StringBuffer sb4 = new StringBuffer(new StringBuffer("hello"));
		System.out.println(sb4);
		
	}
}

StringBuffer

我们知道String类,每次拼接一个字符串,系统都为之开辟一个新的内存空间,这样既耗时又占用了大量的空间,StringBuffer就可以处理这个问题,它是一个字符串缓冲区。

StringBuffer类概述
线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意 时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
构造方法:
StringBuffer() :构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
StringBuffer(CharSequence seq):构造一个字符串缓冲区,它包含与指定CharSequence 相同的字符。
StringBuffer(int capacity) :构造一个不带字符,但具有指定初始容量的字符串缓冲区。
StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。
成员方法:
增 :
StringBuffer append(String str)
StringBuffer insert(int offset, String str)
删 :
StringBuffer deleteCharAt(int index)
StringBuffer delete(int start, int end)
改:
public StringBuffer replace(int start,int end,String str)
其他:
public StringBuffer reverse()
public String substring(int start)
public String substring(int start,int end)

举例代码如下:

public class StringBufferDemo02 {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
		sb.append("Hello");
		System.out.println("sb: " + sb); // ""
		
		sb.append("World").append(20).append('c').append(new Object());
		System.out.println(sb);
		
//		sb.insert(5, "Java");
		sb.insert(sb.indexOf("W"), "Java");
		System.out.println(sb);
		
		sb.deleteCharAt(sb.indexOf("2"));
		System.out.println(sb);
		
		sb.delete(sb.indexOf("j"), sb.length());
		System.out.println(sb);
		
		sb.delete(sb.indexOf("J"), sb.indexOf("W"));
		System.out.println(sb);
		
		sb.replace(sb.indexOf("W"), sb.indexOf("0"), "Good");
		System.out.println(sb);
		
//		sb.reverse();
//		System.out.println(sb);
		
//		public String substring(int start)
		String substring = sb.substring(sb.indexOf("0"));
		System.out.println(sb);
		System.out.println(substring);
		
		System.out.println(sb.substring(sb.indexOf("G"), sb.indexOf("0")));
		
	}
}

StringBuilder

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

经典面试题解析:
String,StringBuffer,StringBuilder三者的区别。

StringBuilder类
线程安全,同步,效率低 StringBuffer
线程不安全,不同步,效率高 StringBuilder

举例:
1.买票 安全
2.访问网站 发送请求请求 index.html 效率
3.WC 小的 大的
三者的区别 String StringBuffer StringBuilder
二者是完全兼容的,二者都是字符串缓冲区,支持可变的字符串操作
线程安全,同步,效率低 StringBuffer
线程不安全,不同步,效率高 StringBuilder

String 长度不可变,线程不安全,效率高
1.String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
2.字符串是常量;它们的值在创建之后不能更改。
3.所有的常量在内存的方法区的常量池中
4.频繁的字符串拼接操作会导致常量池容器增加,浪费内存资源
5.字符串缓冲区【StringBuffer,StringBuilder】支持可变的字符串
6.Java在编译时期会针对字符串的拼接操作使用StringBuilder改进,提高效率,节约内存资源
s = (new StringBuilder(String.valueOf(s))).append(“efg”).toString();
System.out.println((new StringBuilder(“s:”)).append(s).toString());
7.因为 String 对象是不可变的,所以可以共享
8.字符串本质是字符数组

你可能感兴趣的:(JavaSE)