1. String 类

String 类是 Java 虚拟机中的一个重要类,它是用于处理字符串的一种数据类型。String类是一种特殊的类,它是不可变的,也就是说,一旦创建,就不能改变它的值。String 类拥有一些方法,可以用来操作字符串,比如比较字符串、查找字符串、替换字符串等。

2. 常量池

常量池是 Java 虚拟机中的一个概念,它是一种存储常量的内存区域,用于存储编译期间生成的各种字面量和符号引用。常量池中的内容是由编译器自动生成的,并且在类加载的时候就会被加载到内存中。

3. 关系

String 类和常量池之间有着千丝万缕的联系。当程序中使用字符串常量时,Java 虚拟机会先检查常量池中是否已经存在该字符串,如果存在,则返回该字符串的引用,如果不存在,则在常量池中创建一个新的字符串,并返回它的引用。因此,可以说,String 类和常量池是紧密相连的。

4. 实例

public class Test {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        String str3 = new String("Hello");
        System.out.println(str1 == str2);  // true
        System.out.println(str1 == str3);  // false
    }
}

上面的示例中,第1、2行定义了两个字符串常量,str1 和 str2,它们的值都是 "Hello",第3行定义了一个字符串变量 str3,它的值也是 "Hello",但是它是通过 new 关键字创建的。第5行的输出结果为 true,表明 str1 和 str2 是同一个字符串,它们是指向同一个引用。而第6行的输出结果为 false,表明 str1 和 str3 不是同一个字符串,因为 str3 是通过 new 关键字创建的,所以它指向的是一个新的引用。

这里可以看出,当字符串常量被定义时,Java 虚拟机会检查常量池中是否存在该字符串,如果存在,则直接返回该字符串的引用,如果不存在,则会在常量池中创建一个新的字符串,并返回它的引用。