字符串常量池
字符串常量池是 Java 中的一块特殊的内存区域,用于存储字符串字面量。它具有以下几个特点:
-
不可修改性(Immutable): 字符串常量池中的字符串对象是不可修改的,一旦被创建,其内容就不能被修改。任何对字符串的修改都会创建一个新的字符串对象。
-
字符串重用: 字符串常量池是为了节约内存而设计的。相同内容的字符串在常量池中只会存在一份,这样可以通过引用相同的对象来减少内存占用。
-
编译期优化: 字符串常量池的内容是在编译期间确定的,即在代码编写时就已经确定了。这使得编译器能够对字符串进行一些优化,例如合并相同的字符串字面量。
在Java中,字符串常量池有两种存储方式:
-
String Pool(字符串池): 存储在堆中,是在Java 7及之前的版本中的默认存储方式。使用
String.intern()
方法可以将字符串对象从堆中移到字符串池中。 -
Metaspace(元空间): 存储在元空间中,是在Java 8及以后的版本中的默认存储方式。由于元空间的特性,字符串常量池的内存不再受到永久代的限制,可以根据需要动态调整大小。
下面是一个简单的例子,演示了字符串常量池的一些特性:
java
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true,因为它们引用的是字符串常量池中相同的对象 System.out.println(str1 == str3); // false,因为str3是通过new关键字创建的,不在常量池中 System.out.println(str1.equals(str3)); // true,内容相同,使用equals比较
在上述代码中,str1
和 str2
引用了相同的字符串常量池中的对象,而 str3
则是通过 new
关键字创建的新对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)