本周对Java字符串的理解更深了一步。
public static void main(String[] args) { String a = "abc"; String b = "abc"; System.out.println(a == b); }
在新建字符串 b 时,由于字符串常量池中已经存在"abc",所以直接返回其索引,在输出System.out.println(a == b)
时,输出的是true.使用字符串常量池,可以节省空间,获取效率也比较高。
3. 而new String()
是另一种创建字符串的方式。如果常量池中不存在该字符串,则会先在常量池中创建该字符串。然后在堆内存中创建字符串对象,随后返回该字符串的引用,有如下操作:
public static void main(String[] args) { String a = "aa"; String b = new String("aa"); System.out.println(a == b); }
该方法输出false,因为new String()
返回的是堆内存的地址,而字面创建字符串返回的是字符串常量池的地址。
4. 此外,字符串还存在intern方法,在执行该方法时,如果字符串常量池中不存在该字符串,则先创建,然后返回常量池中的引用。