在Java中,字符串常量池是一个特殊的存储区域,用来缓存经常使用的字符串字面量。当你在Java程序中创建字符串字面量时,JVM会首先检查字符串常量池中是否已经存在相同内容的字符串。如果存在,就会返回对该字符串的引用,而不是创建一个新的对象。如果不存在,它将创建一个新的字符串对象,并放入字符串常量池中。
这里有几个场景需要考虑:
1、字符串字面量:
String s1 = "example";String s2 = "example";
在上述代码中,s1 和 s2 是通过字符串字面量创建的,并指向常量池中相同的对象。因此,s1 == s2 将返回 true。
2、使用new关键字创建的字符串对象:
String s3 = new String("example");String s4 = new String("example");
在上述代码中,s3 和 s4 是通过 new 关键字创建的,它们都在堆内存中指向不同的对象。尽管 s3 和 s4 包含相同的字符串值,但它们是两个独立的对象,因此 s3 == s4 会返回 false。
但是,字符串对象可以被显式地转移到字符串常量池中,这通常是通过调用 intern()方法实现的。
3、使用intern()方法的情况:
String s5 = new String("example").intern();String s6 = "example";
在上述代码中,s5 是通过 new 创建然后调用了 intern()方法,这会强制检查字符串常量池中是否有"example"字符串。由于"example"字面量已经存在于常量池中(因为编译器将其添加到了池中),intern()方法会返回对那个已经存在的池中字符串对象的引用。因此,s5 最终会引用和 s6 相同的字符串对象,所以 s5 == s6 将返回 true。
总结:字符串常量池帮助节省内存空间,避免重复创建拥有相同内容的字符串对象。只有通过字符串字面量或者intern()方法得到的字符串对象才会指向常量池中相同的位置。通过 new 关键字创建的字符串对象不会自动存储在常量池中,除非调用了 intern()方法。
本篇文章来源于微信公众号: 互联网面试小帮手
微信扫描下方的二维码阅读本文

Comments NOTHING