String是一个final类,代表不可变的字符序列。
当对字符串重新赋值时,需要重新指定内存区域,不能使用原有value进行赋值
当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值
当调用String的replace方法修改指定字符或字符串,也需要重新指定内存区域赋值
字符串是常量,它们的值在创建之后不能更改。
String对象的字符内容是存储在一个字符数组value[]中的
String实现了Serializable接口:支持序列化
实现了Comparable接口:可以比较大小
内部定义了final char[] value用于存储字符串数据
通过字面量的方式给一个字符串赋值,此时的字符串声明在字符串常量池中。
字符串常量池中是不会存储相同内容的字符串的。
String的实例化方式
1.通过字面量定义的方式
2.通过new+构造器的方式 字符串非常量对象存储在堆中
常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
只要其中有一个是变量,结果就在堆中
如果拼接的结果调用intern()方法,返回值就在常量池中
Heap堆
一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用
类型的真实信息,方便执行器执行,堆内存分成三部分:
新生区 养老区 永久存储区(方法区)
JVM规范将方法区描述为堆的一个逻辑部分,但它还有一个别名叫做Non-Heap ,目的就是要和堆分开。