String str = new String(“abc”) 这种方式,首先在编译类文件时,”abc”常量字符串将会放入到常量结构中,在类加载时,“abc”将会在常量池中创建;其次,在调用 new 时,JVM 命令将会调用 String 的构造函数,同时引用常量池中的”abc” 字符串,在堆内存中创建一个 String 对象;最后,str 将引用 String 对象。即(new String(“abc”) 将在常量池和堆中各创建一个)
intern方法
public native String intern();
String str1= "abc";
String str2= new String("abc");
String str3= str2.intern();
assertSame(str1==str2); //false
assertSame(str2==str3); //false
assertSame(str1==str3); //true
String 中的intern方法会连接到堆中对象,可以省去空间的开销。但使用 intern 方法需要注意的一点是,一定要结合实际场景。因为常量池的实现是类似于一个 HashTable 的实现方式,HashTable 存储的数据越大,遍历的时间复杂度就会增加。如果数据过大,会增加整个字符串常量池的负担。所以,运行时不建议使用。
补充知识:
String中的优化