声明时,java中有一个叫做String Memory Pool的东西:
String str1="abc";
它去那个内存池而不是堆。但是当你写:
String str2=new String("abc");
如果再次输入,它将在堆上创建完整的对象。
String str3 = "abc";
它不会在池上创建更多对象,它将检查池中是否存在此文字,并将其分配给该对象。但是写:
String str4 = new String("abc");
将再次在堆上创建一个新对象
关键是:
一个新对象将始终在您不断编写的时候在堆上创建多次:
new String("abc");
但是,如果您不使用关键字new继续直接分配字符串,则只会从内存池中引用它(如果内存池中不存在它,则会创建它)
intern()方法查找字符串是否在内存池中(如果不是)将其添加到内存池并返回对其的引用。因此,使用此方法后,您的String引用不会指向堆上的任何对象,而是指向String内存池中的一个对象(还要注意,该内存池仅包含唯一的字符串)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)