目录
一、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
二、intern()方法:
/**
intern():*
* 返回字符串对象的规范化表示形式。
* 一个初始为空的字符串池,它由类 String 私有地维护。
* 当调用 intern 方法时,如果池已经包含一个等于此 String
* 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。
* 否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
* intern()扩展重要的点:缓存技术思想、内存结构
*/
//intern():去常量池中找对应的值,有则调用,无则创建
//其实就是String对象的常量缓存
System.out.println(s1==s2.intern());//true
// String s3 = "java";
String s4 = new String("java");
System.out.println(s4==s4.intern());//false