个人博客
String s1 = new String("abc");这句话创建了几个字符串对象?
会创建 1 或 2 个字符串对象。
1、如果字符串常量池中不存在字符串对象“abc”的引用,那么它会在堆上创建两个字符串对象,其中一个字符串对象的引用会被保存在字符串常量池中。
2、如果字符串常量池中已存在字符串对象“abc”的引用,则只会在堆中创建 1 个字符串对象“abc”。
String#intern 方法有什么作用?
String.intern()
是一个 native(本地)方法,其作用是将指定的字符串对象的引用保存在字符串常量池中,可以简单分为两种情况:
- 如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用。
- 如果字符串常量池中没有保存了对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回。
String s1 = new String("ab");
String s2 = s1.intern();
String s3 = "ab";
System.out.println(s1 == s2); // false,因为s1是堆中的对象,s2是字符串常量池中的对象
System.out.println(s2 == s3); // true,因为s2和s3都引用字符串常量池中的同一个对象
虽然intern()方法可以帮助节省内存,但不应该滥用它,因为它需要维护一个常量池,如果过多的字符串被 intern,可能会导致常量池变得庞大,从而浪费内存。
在一些情况下,使用intern()可能会导致性能下降,因此在使用之前应该慎重考虑。
总之,String.intern() 方法是用于在字符串常量池中管理字符串对象的引用,以实现字符串重用和内存优化的方法。在某些情况下,它可以在内存敏感的应用程序中提供性能和内存优势。