String类深入

  1. String类被find关键字修饰, 意味着String类不能被继承, 并且它的成员方法默认为final方法; 字符串一旦被创建就不能再修改.
  2. String类实现SSerializable、CharSequence、 Comparable接口.
  3. String实例的值是通过字符数组实现字符串存储的

无论是sub、concat还是replace操作都不是在原有的字符串上进行的,而是重新生成了一个新的字符串对象。也就是说进行这些操作后,最原始的字符串并没有被改变

String对象一旦被创建就是固定不变的了,对String对象的任何改变都不影响到原对象,相关的任何change操作都会生成新的对象

字符串常量池

我们知道字符串的分配和其他对象分配一样, 是需要消耗高昂的空间和时间的, 而且字符串我们使用的非常多. JVM为了提高性能和减少内存的开销, 正在实例化字符串的时候进行了一些优化:

使用字符串常量池, 每当我们创建字符串常量时, JVM会首先检查字符串常量池, 如果该字符串已经存在常量池中, 那么就直接返回常量池中的实例引用. 如果字符串不存在常量池中, 就是实例化该字符串并且将其放在常量池中. 由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串.

Java中的常量池, 实际上分为两种形态: 静态常量池和运行时常量池.

所谓静态常量池, 即*.class文件中的常量池, class文件中的常量池不仅仅包含字符串(数字)字面量, 还包含类、方法的信息, 占用class文件绝大部分空间.

而运行时常量池, 则是jvm虚拟机再完成类装载操作后, 将class文件中的常量池载入到内存中, 并保存在方法区中, 我们常说的常量池, 就是指方法区中的运行时常量池.