Java(常用类01)
参考视频:445. 常用类-每天一考(尚硅谷)
1. String
1.1 String的特性
- String类:代表字符串。
- String是一个final类,代表不可变的字符序列。(不可变 性)
- 字符串是常量,用双引号 引起来表示。它们的值在创建后不能更改。
- String对象的字符内容是存储在一个字符数组value[]中的。
- String实现了Serializable接口,表示字符串支持序列化。
- String实现了Comparable接口,表示String可以比较大小。
- 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
- 字符串常量池中是不会存储相同内容的字符串的。
1.2 示例

public class Test01 {
public static void main(String[] args) {
String s1 = "Java";
String s2 = "EE";
String s3 = "JavaEE";
String s4 = "Java" + "EE";
String s5 = s1 + "EE";
String s6 = "Java" + s2;
System.out.println(s3==s4);
System.out.println(s3==s5);
System.out.println(s5==s6);
String s8 = s5.intern();
System.out.println(s3==s8);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 当两个String字符串字面量(常量)连接时,会在常量池中生成或寻找。
- 当其中一个常量换成变量进行连接时,就如同new一样,在堆中生成新的字符串。
- 如果拼接的结果调用intern()方法,返回值就在常量池中。
- 如果前面加了final,变成了常量,就在常量池中。
- String与基本数据类型、包装类之间的转换

2. StringBuffer & StringBuilder
2.1 StringBuffer
StringBuffer b = new StringBuffer("111");
b.append("222");
System.out.println(b);
- StringBuffer 在字符串拼接上面直接使用 synchronized 关键字加锁,从而保证了线程安全性。
2.2 StringBuilder
- Since 5.0
- StringBuilder 其实是和 StringBuffer 几乎一样,只不过 StringBuilder 是非线程安全的。
- 并且,为什么 + 号操作符使用 StringBuilder 作为拼接条件而不是使用 StringBuffer 呢?我猜测原因是加锁是一个比较耗时的操作,而加锁会影响性能,所以 String 底层使用 StringBuilder 作为字符串拼接。
2.3 StringBuilder 和 StringBuffer 的扩容问题
- StringBuilder 的初始容量是 16,当然也可以指定 StringBuilder 的初始容量。
- 扩容后的字符串长度会是原字符串长度增加一倍 + 2, 如果扩容后的长度还比拼接后的字符串长度小的话,那就直接扩容到它需要的长度 newCapacity = minCapacity,然后再进行数组的拷贝。
2.4 String和StringBuffer、StringBuilder之间的转换
- String → StringBuffer、StringBuilder:
- 调用StringBuffer、StringBuilder构造器
- StringBuffer、StringBuilder → String:
- 调用String构造器
- 调用StringBuffer、StringBuilder的toString()方法
3. Date
—————— THE END ——————