String str = new String(“abc”) 这种方式,首先在编译类文件时,”abc”常量字符串将会放入到常量结构中,在类加载时,“abc”将会在常量池中创建;其次,在调用 new 时,JVM 命令将会调用 String 的构造函数,同时引用常量池中的”abc” 字符串,在堆内存中创建一个 String 对象;最后,str 将引用 String 对象。即(new String(“abc”) 将在常量池和堆中各创建一个)

image.png

intern方法

  1. public native String intern();
  1. String str1= "abc";
  2. String str2= new String("abc");
  3. String str3= str2.intern();
  4. assertSame(str1==str2); //false
  5. assertSame(str2==str3); //false
  6. assertSame(str1==str3); //true

String 中的intern方法会连接到堆中对象,可以省去空间的开销。但使用 intern 方法需要注意的一点是,一定要结合实际场景。因为常量池的实现是类似于一个 HashTable 的实现方式,HashTable 存储的数据越大,遍历的时间复杂度就会增加。如果数据过大,会增加整个字符串常量池的负担。所以,运行时不建议使用。

补充知识:
String中的优化

image.png