String类对象两种实例化方式比较

时间:2023-03-10 03:20:36
String类对象两种实例化方式比较

第一种:直接赋值

String str =  "hello!" ;

在java中,有一个字符串常量池,对于这种直接赋值的,会直接写进常量池(常量池里面不存在其value,)

自JDK1.7后,常量池也属于堆内存;

所谓的直接赋值,描述的是将一个匿名对象设置一个具体的引用名字

第二种:构造方法

String str = new String("hello!");

这样会开辟两块堆内存,第一块是由“hello!”这个匿名对象开辟,第二块是new开辟

首先会检查常量池里面是否存在“hello!”,如果不存在,则在常量池开辟一空间,然后new出来的String实例,也会在堆内存开辟空间

一般是使用new开辟的那一块空间,而字符串常量池那块内存,将会成为垃圾空间

 package Class_String;

 public class Dome {
public static void main(String[] args) {
String str1 = "123" ;
String str2 = new String("123") ;
String str3 = new String("123") ; System.out.println(str1 == str2) ; //false System.out.println(str1 == str2.intern()); //true System.out.println(str2 == str3); //false
}
}

面试题:解释String类两种对象实例化方式的区别

直接赋值:只产生一个实例化对象,并且自动保存到常量池中,可以实现字符串实例的重用

构造方法:产生两个实例化对象,并且不会入池,无法实现重用,可以通过手工intern()方法入池,

一般情况下使用直接赋值,因为效率更高,

最后,因为我也是刚开始学java,或许会有不足之处,

欢迎有疑惑的 or 有不同意见的,可以在下面进行评论,喵~~

相关文章