第一种:直接赋值
String str = "hello!" ;
在java中,有一个字符串常量池,对于这种直接赋值的,会直接写进常量池(常量池里面不存在其value,)
自JDK1.7后,常量池也属于堆内存;
所谓的直接赋值,描述的是将一个匿名对象设置一个具体的引用名字
第二种:构造方法
String str = new String("hello!");
这样会开辟两块堆内存,第一块是由“hello!”这个匿名对象开辟,第二块是new开辟
首先会检查常量池里面是否存在“hello!”,如果不存在,则在常量池开辟一空间,然后new出来的String实例,也会在堆内存开辟空间
一般是使用new开辟的那一块空间,而字符串常量池那块内存,将会成为垃圾空间
1 package Class_String; 2 3 public class Dome { 4 public static void main(String[] args) { 5 String str1 = "123" ; 6 String str2 = new String("123") ; 7 String str3 = new String("123") ; 8 9 System.out.println(str1 == str2) ; //false 10 11 System.out.println(str1 == str2.intern()); //true 12 13 System.out.println(str2 == str3); //false 14 } 15 }
面试题:解释String类两种对象实例化方式的区别
直接赋值:只产生一个实例化对象,并且自动保存到常量池中,可以实现字符串实例的重用
构造方法:产生两个实例化对象,并且不会入池,无法实现重用,可以通过手工intern()方法入池,
一般情况下使用直接赋值,因为效率更高,
最后,因为我也是刚开始学java,或许会有不足之处,
欢迎有疑惑的 or 有不同意见的,可以在下面进行评论,喵~~