1、分析直接赋值的对象实例化模式

在内存中开辟一块堆内存,而且对于同一字符串的多次赋值还可以实现对堆内存空间的重用。既:在内容相同的情况下不会开辟新的堆内存空间,而会直接指向已有的堆内存空间
范例:观察直接赋值时的堆内存直接引用
public class StringDemo137 {
public static void main(String[] args) {
String strA="LLL"; //直接赋值实例化
String strB="LLL"; //直接赋值实例化
String strC="KKK"; //直接赋值实例化,内容不相同
System.out.println(strA==strB);
System.out.println(strA==strC);
}
}
true
false
内容一样:指向同一堆内存空间;
内容不一样:则会自动开辟新的内存空间



字符串常量池



共享设计模式,用完存在常量池中,下次用直接拿
2、分析构造方法实例化

使用构造方法的实例化,实际上会开辟两块空间,其中一块将成为垃圾,由于new表示开辟新的堆内存空间,所以内容不会保存在对象池中
范例:构造方法实例化String类对象不自动入池保存
public class StringDemo139 {
public static void main(String[] args) {
String strA=new String("lll");
String strB="lll";
System.out.println(strA==strB);
}
}
false
如果希望新开辟的新内存数据也能进入对象池保存,那么可以进行aString类定义的一个手动入池方法
手动保存到对象池:public String intern();
范例:String类对象手动入池
public class StringDemo139 {
public static void main(String[] args) {
String strA=new String("lll").intern();
String strB="lll";
System.out.println(strA==strB);
}
}
true
两种String类对象实例化区别
直接赋值:只会开辟一块堆内存空间,并且会自动保存在对象池中以供下次重复使用
构造方法:会开辟两块堆内存空间,其中有一块将成为垃圾,并且不会自动入池,但是用户可以使用intern()
方法手动入池。
859

被折叠的 条评论
为什么被折叠?



