目录
一、StringBuilder和StringBuffer
1.数组的初始状态
2.如何扩容?
二、intern()方法:
一、StringBuilder和StringBuffer
StringBuffer保存的char数组是可变的。
1.数组的初始状态
value数组,默认长度16,可以根据参数进行初始化。
2.如何扩容?
扩容原数组长度的2倍+2.
相同:
StringBuffer和StringBuilder都没有重写equals方法。
它们的方法和操作基本相同。
StringBuilder sb1 = new StringBuilder();
//1.追加
sb1.append("java");
System.out.println(sb1);//java
//2.插入
sb1.insert(0, "hello ");
System.out.println(sb1);//hello java
//3.替换
sb1.replace(0, 5, "你好");
System.out.println(sb1);//你好 java
//4.删除
System.out.println(sb1.delete(2, 3));//你好java
//5.反转
System.out.println(sb1.reverse());//avaj好你
不同:
1.线程安全与否:
StringBuffer 线程安全的,方法加synchronized修饰。多个线程并发读写不会引起冲突。
StringBuilder(JDK 1.5)线程不安全的,方法没有synchronized修饰。多个线程并发读写会引起冲突。因为效率和性能问题StringBuilder取消了线程同步机制,它有其他的线程安全解决方法。
2.效率高低:
StringBuilder > StringBuffer >String
3.capacity():字符容量方面
StringBuilder长度、字符容量
//length():返回字符序列的长度
//capacity():字符容量。
//当起始分配的字符容量16,没有存满时,此时的capacity()输出容量为16;
//当起始容量满,又扩展之后,此时的capacity()输出容量为 起始容量+字符序列的长度(16+length())。
System.out.println(sb1.length());//6
System.out.println(sb1.capacity());//16
StringBuilder sb2 = new StringBuilder("0123456789abcdefg");
System.out.println(sb2.length());//17
System.out.println(sb2.capacity());//33
StringBuffer长度、字符容量
//length():返回字符序列的长度
//capacity():字符容量。
//StringBuffer在为对象分配长度的时候,起始会分配一个字,也就是两个字节长度即(16位),
//每增加一个字符,长度就会在16的基础上加 1。即capacity()输出容量为 起始容量+字符序列的长度(16+length())
StringBuffer sb1 = new StringBuffer("hello");
System.out.println(sb1.length());//5
System.out.println(sb1.capacity());//21



