面试题答案
一键面试1. intern()
方法的作用
intern()
方法用于返回字符串对象的规范化表示形式。它会检查字符串常量池中是否存在与当前字符串内容相同的字符串,如果存在,则返回常量池中该字符串的引用;如果不存在,则将当前字符串添加到常量池中,并返回该字符串在常量池中的引用。
2. intern()
方法的原理
在Java中,字符串常量池是一个特殊的内存区域,用于存储字符串常量。intern()
方法通过比较字符串的内容,利用equals
方法来判断常量池中是否已有相同内容的字符串。如果找到匹配的字符串,就返回常量池中该字符串的引用,否则在常量池中创建一个新的字符串实例,并返回其引用。
3. 优化内存的场景
- 大量重复字符串场景:当程序中存在大量相同内容的字符串对象时,使用
intern()
方法可以让这些字符串共享常量池中的同一个实例,从而减少内存占用。例如,在处理大量日志信息、配置文件读取等场景下,如果有很多重复的字符串,调用intern()
方法可以优化内存。
4. 使用不当的风险
- 性能问题:调用
intern()
方法时,每次都会在常量池中进行查找操作,这会带来一定的性能开销。如果在循环中频繁调用intern()
方法,可能会导致性能下降。 - 内存泄漏风险:由于字符串常量池在Java 7之前位于永久代(PermGen),Java 7及之后位于堆内存中,若滥用
intern()
方法,常量池可能会被大量字符串填满,导致内存溢出问题,特别是在Java 7之前,永久代的空间有限,更容易出现这种情况。
5. 举例说明对字符串内存存储的影响
public class StringInternExample {
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = s1.intern();
String s3 = "hello";
System.out.println(s1 == s2); // false,s1是堆中的对象,s2是常量池中的对象
System.out.println(s2 == s3); // true,s2和s3都指向常量池中的同一个"hello"字符串
}
}
在上述代码中,s1
是通过new
关键字在堆中创建的字符串对象。调用s1.intern()
后,s2
指向常量池中的"hello"字符串。s3
直接使用字符串字面量创建,也指向常量池中的"hello"字符串。所以,s1 == s2
为false
,而s2 == s3
为true
。这表明intern()
方法可以使不同的字符串对象指向常量池中的同一个实例,从而影响字符串在内存中的存储方式。