一.Java中为String的实例化提供两种方式
1.直接赋值
String str = "字符串"; //只在常量池(堆内存)中开辟了一块内存
共享设计模式:
在JVM的底层实际上存在一个对象池(不一定只有String,涉及直接赋值时,就会将此字符串所使用的的匿名对象保存,而且会保留。当我们以后在使用直接赋值时就不会再开辟新的空间 )
2.new关键字创建对象
String str = new String("字符串")
此时堆内存会先开辟一个内存空间a("字符串"),然后new String()就又会开辟一个空间b,通过"="将a的值赋给b,栈中的str指向b空间。此时a就成了垃圾空间
二.两种实例化方式的比较
1.直接赋值只需开辟一块一块内存空间;而利用构造器方式对String实例化则需开辟两块内存空间,且其中一块为垃圾。
2.直接赋值的方式产生的对象会直接进入常量池,而通过构造器方式实例化的对象不会自动进入常量池,需要手动通过intern()方法手动入池
三.字符串常量的值一旦定义无法改变
String的内容不能改变,只是引用地址的改变,每一次改变都会产生垃圾空间
因此,String的内容不宜频繁的进行改变,改变就会产生垃圾