一、String类
- String声明为final 不可被继承
- String实现了Serializable接口: 表示字符串是支持序列化的
- String实现了Comparable接口: 表示String可以比较大小
- String内部定义了final char[] value 用于存储字符串数据
- Sting代表不可变的字符序列 简称不可变性
- 体现1: 当对字符串重写赋值时 需要重写指定内存区域赋值 不能使用原有value进行赋值
- 体现2: 当对现有字符串进行链接操作时 也需要重写指定内存区域进行赋值 不能使用原有value赋值
- 通过字面量(非new)方式给一个字符串赋值 此时的字符串值声明在方法区的字符串常量池中
- 字符串常量池中不会存储相同内容的字符串
- 常量与常量的拼接结果在常量池 常量池中不会存在相同内容的常量
- 只要其中一个是变量 结果就在堆空间中
- 如果拼接结果调用intern() 返回值在常量池中
/**
* 创建人:LYY
* 创建时间:2022/4/30
*/
public class StringTest {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
// s3 地址值指向堆空间
String s3 = s1 + s2;
// s4 地址值指向常量池
String s4 = "hello" + "world";
String s5 = s1 + "world";
// 调用intern() 地址值指向常量空间
String s6 = ("hello" + s2).intern();
// false s3地址值指向堆空间 s4地址值指向常量池
System.out.println(s3 == s4);
// false s3地址值指向堆空间 s5地址值指向堆空间 两个不同的对象
System.out.println(s3 == s5);
// true 两个变量的地址值都指向常量空间 常量池中不会存在相同的字符串 因此共用同一地址
System.out.println(s4 == s6);
}
}