跳至主要內容

Java面向对象(基础)- String类

bsfc.tech大约 2 分钟JavaJavaSE

Java面向对象基础

❤️ String类

1. Java中的String类

在Java编程语言中,String 类代表不可变的字符序列。它是Java核心API中的一个关键类,位于 java.lang 包下,因此不需要显式导入即可使用。 String 类提供的字符串对象一旦创建,其内容就不能更改。每次对字符串进行修改操作(如拼接、替换等),实际上都会生成一个新的 String 对象。

// 创建String对象
String str1 = "Hello";
String str2 = "World";

// 不可变性的示例
str1 += " World"; // 这将创建一个新的String对象而非修改原对象
System.out.println(str1); // 输出: Hello World
System.out.println(str2); // 输出: World,原始对象不受影响

// 字符串常量池引用
String str3 = "Hello";
String str4 = "Hello";
System.out.println(str3 == str4); // 输出: true,两个引用指向了相同的字符串常量池对象

2. 字符串常量池与intern()方法

Java虚拟机(JVM)为了提高性能和减少内存开销,维护了一个称为“字符串常量池”的区域。当创建一个字符串字面量时(如上述代码中的 "Hello"),JVM会在字符串常量池中检查是否存在相同内容的字符串对象。如果存在,则直接引用池中的对象;如果不存在,则创建新的字符串对象并放入池中。

String str5 = new String("Hello");
String str6 = "Hello";
System.out.println(str5 == str6); // 输出: false,因为str5是new出来的对象,而str6直接引用了常量池中的对象

str5 = str5.intern(); // 调用intern方法后,str5尝试将其引用改为指向常量池中的对象
System.out.println(str5 == str6); // 输出: true,现在str5和str6都指向了常量池中的同一对象

3. HotSpot JVM中字符串常量池存放

在Oracle的HotSpot JVM实现中,字符串常量池在JDK 6及更早版本位于永久代(PermGen)空间中,而在JDK 7及更高版本中,字符串常量池被移到了堆内存中。具体来说,字符串常量池被存储在一个名为StringTable的哈希表结构中,这是一个全局的数据结构,这意味着在单个JVM实例中,所有线程和类共享同一个字符串常量池。

提示

Java中的String类作为不可变对象,在HotSpot JVM中有特殊的优化处理。通过利用字符串常量池,JVM能够有效地复用相同的字符串实例,从而节省内存并提升程序运行效率。同时,intern()方法提供了一种主动将字符串对象放入常量池的手段,使得具有相同内容的字符串能够确保引用相等,这对于内存管理以及一些特定场景下的性能优化至关重要。